pybind11 中的非连续数组指针遍历问题?
Non contiguous array pointer traversing issue in pybind11?
请问有人知道为什么当我正常传递我的 2 dim Numpy float64 (Double) 数组时,当我使用 pos 遍历指针时,它会正确地逐行打印 col1、col2、col3、col4。
但是,当我传递一个形状为 42 行、4 列的特定 numpy 数组时,它会打印所有 col1,然后打印所有 col2、所有 col3 和所有 col4,而不是打印一行一次,有人能发现我做错了什么吗?
我欢迎任何关于潜在原因或解决方案的提示:)
我在想可能是因为内存限制,但是其他更大的数组没有任何问题
请注意,我正在使用 pybind11 将我的 numpy 数组传递给 C++,然后 C++ 遍历 ptr 以一次打印出每一行,这对于“数组 A”和“数组 B”非常有效,除了对于 42 行 4 列的新“数组 C”,所有数组都是浮点数 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 行 x 4 列,例如“数组 C”:
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,然后遍历 Tenors,然后遍历出价,然后遍历要价。
---- 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.values 来增加 np 数组从导致问题的 pandas 数据框,任何人都有任何想法,如果可能的话,了解是什么导致了 numpy 数组的不同内存顺序?
当在 numpy 中从头开始创建 Numpy 数组而不是通过从 Pandas 转换为 numpy 时,df.values 将保持连续且正确的顺序。
:)
例如以下效果很好:
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
请问有人知道为什么当我正常传递我的 2 dim Numpy float64 (Double) 数组时,当我使用 pos 遍历指针时,它会正确地逐行打印 col1、col2、col3、col4。
但是,当我传递一个形状为 42 行、4 列的特定 numpy 数组时,它会打印所有 col1,然后打印所有 col2、所有 col3 和所有 col4,而不是打印一行一次,有人能发现我做错了什么吗?
我欢迎任何关于潜在原因或解决方案的提示:)
我在想可能是因为内存限制,但是其他更大的数组没有任何问题
请注意,我正在使用 pybind11 将我的 numpy 数组传递给 C++,然后 C++ 遍历 ptr 以一次打印出每一行,这对于“数组 A”和“数组 B”非常有效,除了对于 42 行 4 列的新“数组 C”,所有数组都是浮点数 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 行 x 4 列,例如“数组 C”:
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,然后遍历 Tenors,然后遍历出价,然后遍历要价。
---- 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.values 来增加 np 数组从导致问题的 pandas 数据框,任何人都有任何想法,如果可能的话,了解是什么导致了 numpy 数组的不同内存顺序?
当在 numpy 中从头开始创建 Numpy 数组而不是通过从 Pandas 转换为 numpy 时,df.values 将保持连续且正确的顺序。
:)
例如以下效果很好:
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