请有人知道为什么当我传递我的2 dim Numpy float64 (Double)数组时,它通常正确地逐行打印,col1, col2, col3, col4,因为我通过使用pos遍历指针。
然而,当我传递一个形状为42行,4色的特定numpy数组时,它反而打印,所有的col1,然后所有的col2,所有的col3和所有的col4,而不是一次一行,请任何人发现我做错了什么?
我欢迎任何关于潜在原因或解决方法的提示:)
我想也许是由于内存限制,但是其他更大的数组没有任何问题
请注意,我使用pybind11将我的numpy数组传递给c++,然后它遍历ptr以一次打印出每一行,这在"数组a"中工作得很好;,"数组B"除了新的"数组"也就是42行乘4列,所有数组都是浮点64。
void Pricing::print_array_simple(py::array_t<double>& in_results) {
if (in_results.ndim() != 2) {
throw std::runtime_error("Results should be a 2-D Numpy array");
}
py::buffer_info buf = in_results.request();
double* ptr = (double*)buf.ptr;
int array_number_rows =in_results.shape()[0]; //rows
int array_max_size = in_results.shape()[1];//cols
cout << "rows: " << array_number_rows << " Cols: " << array_max_size << "n";
size_t pos = 0;
std::cout << "n---- START OF ARRAY ----n";
for (size_t i = 0; i < array_number_rows; i++) {
//rows
for (size_t j = 0; j < array_max_size; j++) {
//cols
std::cout << std::left <<std::setw(12) <<ptr[pos];
pos++;
}
std::cout << "|n";
}
}
正常工作的数组(72,7),例如数组A或数组B:
CCY TENOR BID ASK MID LAST_BID_TIME_TODAY_REALTIME SETTLEMENT_DATE_RT
0 1.0 1.0 1265.2000 1266.7000 1265.9500 1.651646e+09 1.652051e+09
1 1.0 2.0 1265.3600 1266.3500 1265.8600 1.651661e+09 1.652656e+09
2 1.0 3.0 1265.2400 1266.2800 1265.7600 1.651662e+09 1.654729e+09
3 1.0 4.0 1264.4500 1265.5500 1265.0000 1.651662e+09 1.657494e+09
4 1.0 5.0 1263.5600 1264.6400 1264.1000 1.651662e+09 1.660000e+09
.. ... ... ... ... ... ... ...
67 6.0 8.0 6.7351 6.7411 6.7381 1.651662e+09 1.683500e+09
68 6.0 9.0 6.7870 6.7970 6.7920 1.651662e+09 1.714950e+09
69 6.0 10.0 6.8431 6.8614 6.8522 1.651662e+09 1.746486e+09
70 6.0 11.0 6.9734 6.9883 6.9809 1.651662e+09 1.778022e+09
71 6.0 12.0 7.1178 7.1277 7.1228 1.651659e+09 1.809558e+09
c++输出:
---- START OF ARRAY ----
1 1 1265.2 1266.7 1265.95 1.65165e+09 1.65205e+09 |
1 2 1265.36 1266.35 1265.86 1.65166e+09 1.65266e+09 |
1 3 1265.24 1266.28 1265.76 1.65166e+09 1.65473e+09 |
1 4 1264.45 1265.55 1265 1.65166e+09 1.65749e+09 |
1 5 1263.56 1264.64 1264.1 1.65166e+09 1.66e+09 |
1 6 1259.79 1262.01 1260.9 1.65166e+09 1.66795e+09 |
1 7 1256.05 1258.09 1257.07 1.65166e+09 1.6759e+09 |
1 8 1250.87 1254.47 1252.67 1.65166e+09 1.68359e+09 |
1 9 1242.32 1244.57 1243.44 1.65166e+09 1.71521e+09 |
1 10 1233.71 1243.59 1238.65 1.65165e+09 1.74675e+09 |
1 11 1234.94 1242.71 1238.82 1.65165e+09 1.77845e+09 |
1 12 1228.37 1236.78 1232.57 1.65165e+09 1.8099e+09 |
2 1 76.4175 76.425 76.4213 1.65166e+09 1.65179e+09 |
这个数组不工作,42行乘4行,例如"array ":
CCY TENOR BID ASK
0 1.0 0.0 1255.9000 1256.4000
1 1.0 1.0 1256.0000 1256.5000
2 1.0 2.0 1255.4000 1256.0000
3 1.0 3.0 1254.6000 1255.2000
4 1.0 4.0 1251.4000 1252.2000
5 1.0 5.0 1247.7000 1248.5000
6 1.0 6.0 1244.0000 1244.9000
7 2.0 0.0 76.2600 76.3000
8 2.0 1.0 76.4600 76.5100
9 2.0 2.0 76.7300 76.7900
10 2.0 3.0 77.0100 77.0700
11 2.0 4.0 77.8100 77.8800
12 2.0 5.0 78.5600 78.6500
13 2.0 6.0 79.4900 79.5700
c++中的输出:
它遍历CCY's,然后遍历Tenors,然后遍历Bids &
---- START OF ARRAY ----
1 1 1 1 |
1 1 1 2 |
2 2 2 2 |
2 2 3 3 |
3 3 3 3 |
3 4 4 4 |
4 4 4 4 |
5 5 5 5 |
5 5 5 6 |
6 6 6 6 |
6 6 0 1 |
6 0 1 2 |
3 4 5 6 |
0 1 2 3 |
4 5 6 0 |
1 2 3 4 |
5 6 0 1 |
2 3 4 5 |
3 4 5 6 |
1255.9 1256 1255.4 1254.6 |
1251.4 1247.7 1244 76.26 |
76.46 76.73 77.01 77.81 |
78.56 79.49 29.46 29.41 |
29.335 29.265 29.07 28.89 |
28.705 14442 14470 14507 |
14545 14650 14755 14860 |
52.41 52.63 52.82 52.97 |
53.38 53.72 54.02 6.6681 |
6.6861 6.7026 6.7151 6.7416 |
6.7571 6.7681 1256.4 1256.5 |
1256 1255.2 1252.2 1248.5 |
1244.9 76.3 76.51 76.79 |
77.07 77.88 78.65 79.57 |
29.485 29.44 29.375 29.305 |
29.12 28.94 28.755 14442 |
14480 14523 14565 14680 |
14785 14900 52.45 52.68 |
52.88 53.03 53.45 53.8 |
54.1 6.6711 6.6911 6.7086 |
6.7221 6.7486 6.7641 6.7761 |
Python
Python code to create array C:
lst = []
for i in range(1,7):
for j in range(7):
lst.append([float(i),float(j),123.1, 124.1])
lst
arr_example = np.array(lst)
arr_example
更新:然后将arr_example传递到函数中,当我把数组做成这样时,它似乎是有效的,我认为这是因为在python中,我实际上使用的是df。值从pandas数据框中额外的np数组会导致问题,如果这是可能的,有人有任何想法,了解是什么导致numpy数组的不同内存顺序?
在Numpy中从头开始创建Numpy数组而不是从Pandas转换为Numpy时,df。值,则保持连续且正确的顺序。
:)
。下面的代码很好:
Python code to create array C:
lst = []
for i in range(1,7):
for j in range(7):
lst.append([float(i),float(j),123.1, 124.1])
lst
arr_example = np.array(lst)
arr_example