Изменить массив массивов, имеющий только одно измерение - PullRequest
0 голосов
/ 07 июня 2018

Для того, чтобы получить массив NumPy из list, я делаю следующее:

np.array([i for i in range(0, 12)])

И получаю:

array([ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11])

Затем я хотел бы сделать (4,3) матрица из этого массива:

np.array([i for i in range(0, 12)]).reshape(4, 3)

, и я получаю следующую матрицу:

array([[ 0,  1,  2],
       [ 3,  4,  5],
       [ 6,  7,  8],
       [ 9, 10, 11]])

Но если я знаю, что у меня будет 3 * n элементов в исходном list как мне изменить форму моего массива, потому что следующий код

np.array([i for i in range(0,12)]).reshape(a.shape[0]/3,3)

приводит к ошибке

TypeError: 'float' object cannot be interpreted as an integer

Ответы [ 2 ]

0 голосов
/ 07 июня 2018

Вы можете использовать -1 в .reshape.Если вы укажете одно измерение, Numpy определит другое измерение автоматически, когда это возможно [1].

np.array([i for i in range(0,12)]).reshape(-1, 3)

[1] https://docs.scipy.org/doc/numpy/reference/generated/numpy.reshape.html

0 голосов
/ 07 июня 2018

Во-первых, np.array([i for i in range(0, 12)]) - это менее изящный способ сказать np.arange(12).

Во-вторых, вы можете передать -1 одному измерению формы (обе функции np.reshape и метод np.ndarray.reshape).В вашем случае, если вы знаете, что общий размер кратен 3, выполните

np.arange(12).reshape(-1, 3)

, чтобы получить массив 4x3.Из документов:

Одно измерение формы может быть -1.В этом случае значение выводится из длины массива и оставшихся измерений.

В качестве примечания, причина того, что вы получаете ошибку, состоит в том, что регулярное деление, даже для целых чисел, автоматически приводит кв float в Python 3: type(12 / 3) равно float.Вы можете заставить свой оригинальный код работать, выполнив a.shape[0] // 3, чтобы использовать вместо этого целочисленное деление.Тем не менее, использование -1 гораздо удобнее.

...