Разрезание массива рангов 2 с использованием двух объектов диапазона

Если по какой-либо причине вы хотели сделать это вручную (без использования модуля, такого как csv, pandas, numpy и т. д.):

with open('myfile.csv','w') as f:
    for sublist in mylist:
        for item in sublist:
            f.write(item + ',')
        f.write('\n')

Конечно, версия может быть подвержена ошибкам и неэффективна ... обычно для этого есть модуль. Но иногда писать свои собственные могут помочь вам понять, как они работают, а иногда просто проще.

0
задан Kurohige 11 March 2019 в 21:54
поделиться

1 ответ

Почему вы ожидаете, что они сделают то же самое? numpy отличается от MATLAB таким индексированием.

In [6]: arr = np.arange(9).reshape(3,3)

In [7]: arr[range(3),range(3)]
Out[7]: array([0, 4, 8])

С диапазоном (или списком или массивом с одинаковыми значениями) он возвращает массив 1d, в данном случае диагональ массива 2d. Эта индексация выбирает набор точек, а не блок.

В numpy, если вы хотите получить двумерный результат с «расширенной индексацией», вам нужно создать пару индексных массивов, которые вместе передают правильную форму:

In [8]: arr[np.arange(3)[:,None],range(3)]
Out[8]: 
array([[0, 1, 2],
       [3, 4, 5],
       [6, 7, 8]])

В MATLAB / octave легко выбрать блок, но гораздо сложнее выделить отдельные элементы.

arr(sub2ind([3,3],[1,2,3],[1,2,3]))

В общем, чтобы понять numpy расширенное индексирование, вам нужно понимать широковещательную рассылку, которая относится к индексированию, а также к математическим операциям, таким как сложение.

0
ответ дан Joseph Greenpie 11 March 2019 в 21:54
поделиться
Другие вопросы по тегам:

Похожие вопросы: