Проблема с пересечением указателя несмежного массива в pybind11?

Пожалуйста, кто-нибудь знает, почему, когда я передаю свой 2 тусклых массива Numpy float64 (Double), он обычно правильно печатает строку за строкой, col1, col2, col3, col4, когда я перемещаю указатель, используя pos.

Однако, когда я передаю конкретный массив numpy из 42 строк, 4 столбца, он вместо этого печатает все столбцы 1, затем все столбцы 2, все столбцы 3 и все столбцы 4, а не строки за раз, пожалуйста, может ли кто-нибудь определить, что я делаю неправильно?

Я приветствую любые советы относительно потенциальной причины или решения :)

Я думал, возможно, это из-за ограничений памяти, однако другие массивы большего размера не имеют проблем.

Обратите внимание, что я использую pybind11 для передачи моего массива numpy в C++, который затем проходит через ptr для вывода каждой строки за раз, что хорошо работает для «массива A» и «массива B», за исключением нового «массива C", который составляет 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

Вывод С++:

---- 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 столбца, например "массив 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

вывод на С++:

Он перебирает CCY, затем перебирает тенор, затем перебирает заявки, а затем запросы.

---- 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 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?

Все, что у нас есть, это код C++ и ваше обещание, что массив, который вы отправляете, содержит данные, которые вы ожидаете. Таким образом, будет почти невозможно дать вам ответ, учитывая то, что вы опубликовали. Код C++ не будет иметь собственного разума и вести себя по-другому если массив содержит элементы так, как вы говорите, что они отправляются. Таким образом, вывод может быть на стороне отправки, а не на стороне приема.

PaulMcKenzie 06.05.2022 15:17

Кроме того, если он не является непрерывным, как вы утверждаете, я не вижу, чтобы ptr переустанавливался для каждой встречающейся строки. Вместо этого ptr обрабатывается так, как если бы данные были непрерывными.

PaulMcKenzie 06.05.2022 15:21

@PaulMcKenzie, спасибо, я постараюсь быстро загрузить генератор Python для базового массива numpy. Спасибо

Py_trader 06.05.2022 15:23

@PaulMcKenzie Пожалуйста, посмотрите мой код Python, обновление выше, я думаю, что это может быть связано с преобразованием фрейма данных pandas в массив numpy, когда я вызываю pandas.values ​​для создания 2D-массива numpy, который может быть причиной этого, однако я не уверен, возможно из-за необходимости сначала выполнить глубокую копию в python? любые идеи или понимание приветствуются

Py_trader 06.05.2022 15:58
Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
0
4
35
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

При создании массива 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

Другие вопросы по теме