Numpy: ValueError: не удалось передать входной массив из формы (4,1) в форму (4)

Я использую Python 3.7 с numpy 1.18.3. У меня есть массив, содержащий 4 строки. Мне периодически нужно добавлять новый столбец. Каждый раз, когда я добавляю новую запись в массив, он определяется как 4,1 array (t).

Время от времени я проверяю, сможет ли корзина вместить выделение (d_entry ниже) и придется ли мне вычитать выделение из корзины и обновлять столбец.

импортировать numpy как np

t = 4x1 numpy array [[  150], [50000], [30000], [20000]]
d_entry = 4x1 numpy array [[2.6000e+01], [1.1638e+04], [5.0000e+00], [9.8290e+03]]

new_bin = np.subtract(t, d_entry)
bin_space =  np.append(bin_space, new_bin, axis=1)

Так, например, с двумя записями bin мое bin_space в конечном итоге выглядит так:

[[  107.   124.], [27798. 38362.], [29992. 29995.], [ 9401. 10171.]]

Записи пространства бункера (столбцы) иногда необходимо обновлять, как объяснено, заменяя записи обновленными столбцами 4 x 1.

Для этого я ссылаюсь на столбец bin_space следующим образом:

space_left = np.array(bin_space[:,j])   

(который, по словам PyCharm, теперь является (4,), а не 4,1

bin_space[:,j] = np.subtract(space_left, d_entry)**

Затем я получаю ошибку. Я не уверен, как можно извлечь из массива тот же тип.

Отслеживание (последний вызов последним): файл "D: /Development/oasg-apps/src/mcl/python/mcl_bin_packing.py", строка 398, в файле main () "D: / Development / oasg-apps / src / mcl / python / mcl_bin_packing.py ", строка 247, в главном n_bins, bin_for_item, bin_space = allocate_ffd (d_vectors, t_resource, num_metrics_types) Файл" D: /Development/oasg-apps/src/mcl/python/mcl_bin_packing " строка 135, в allocate_ffd bin_space [:, j] = np.subtract (space_left, d_entry) ValueError: не удалось передать входной массив из формы (4,1) в форму (4)

Это воспроизводит проблему, но с «не удалось передать входной массив из формы (2,1) в форму (2)»:

import numpy as np

bin_space = np.array([0, 0])
bin_space = np.reshape(bin_space, (2,1))

# Shape our target resources into a numpy array.
target_resource = np.array([150, 50000])
target_resource = np.reshape(target_resource,(2,1))

new_resource = np.array([10, 200])
new_resource = np.reshape(new_resource,(2,1))

bin_space = np.append(bin_space, target_resource, axis=1)
bin_space = np.append(bin_space, target_resource, axis=1)

bin_space[:,1] =  new_resource

Любая помощь приветствуется.

Спасибо,

Клайв


person avalon20    schedule 30.04.2020    source источник
comment
Не могли бы вы опубликовать трассировку ошибки, также ваш код испорчен, попробуйте исправить это   -  person Shubham Shaswat    schedule 30.04.2020
comment
Полагаю, вам нужно сделать array.flatten(), array.resize((-1, 1)) или что-то подобное. Я согласен с тем, что вам следует исправить вопрос. В SO лучше всего предоставить минимальный рабочий пример. На данный момент я не могу воспроизвести ваш код.   -  person rpoleski    schedule 30.04.2020
comment
В сообщение добавлен код, который позволяет воспроизвести проблему.   -  person avalon20    schedule 30.04.2020
comment
Хорошо, а теперь постарайтесь сделать ваш пример минимальным.   -  person rpoleski    schedule 30.04.2020
comment
Более минимально сделано. Спасибо.   -  person avalon20    schedule 30.04.2020


Ответы (1)


Или:

bin_space[:,1] = new_resource.T

or:

bin_space[:,1] = new_resource.flatten()
person rpoleski    schedule 30.04.2020
comment
Привет спасибо. New_resource.flatten (), похоже, помогает. Работает ли это, позволяя numpy приводить к форме фрагмента массива, на который я ссылаюсь? - person avalon20; 30.04.2020