Numpy изменить форму с ошибкой броска остатка - PullRequest
2 голосов
/ 27 апреля 2019

Как я могу разбить этот массив на массивы длины 3 с дополненным или не дополненным остатком (не имеет значения)

>>> np.array ([0,1,2,3,4,5,6,7,8,9,10]). Reshape ([3, -1])

ValueError: невозможно преобразовать массив размера 11 в форму (3, новая ось)

Ответы [ 3 ]

2 голосов
/ 27 апреля 2019
### Two Examples Without Padding

x = np.array([0,1,2,3,4,5,6,7,8,9,10])
desired_length = 3
num_splits = np.ceil(x.shape[0]/desired_length)

print(np.array_split(x, num_splits))

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

x = np.arange(13)
desired_length = 3
num_splits = np.ceil(x.shape[0]/desired_length)

print(np.array_split(x, num_splits))

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

### One Example With Padding

x = np.arange(13)
desired_length = 3
padding = int(num_splits*desired_length - x.shape[0])
x_pad = np.pad(x, (0,padding), 'constant', constant_values=0)

print(np.split(x_pad, num_splits))

# Prints:
# [array([0, 1, 2]), array([3, 4, 5]), array([6, 7, 8]), array([ 9, 10, 11]), array([12,  0,  0])]
1 голос
/ 27 апреля 2019

Если вы хотите избежать заполнения нулями, самый элегантный способ сделать это может быть нарезка в понимании списка:

>>> import numpy as np
>>> x = np.arange(11)
>>> [x[i:i+3] for i in range(0, x.size, 3)]
[array([0, 1, 2]), array([3, 4, 5]), array([6, 7, 8]), array([ 9, 10])]
0 голосов
/ 27 апреля 2019

Если вы хотите заполнить нулями, ndarray.resize() сделает это за вас, но вы должны сами определить размер ожидаемого массива:

import numpy as np

x = np.array([0,1,2,3,4,5,6,7,8,9,10])

cols = 3
rows = np.ceil(x.size / cols).astype(int)

x.resize((rows, cols))
print(x)

В результате:

[[ 0  1  2]
 [ 3  4  5]
 [ 6  7  8]
 [ 9 10  0]]

Насколько я могу судить, это в сотни раз быстрее, чем подход со списком (см. Мой другой ответ).

Обратите внимание, что если вы сделаете что-нибудь с x перед изменением размера, вы можете столкнуться с проблемой со "ссылками".Либо работайте на x.copy(), либо передайте refcheck=False на resize().

...