Мне нужно преобразовать массивы numpy, чтобы отобразить некоторые данные. Следующая работа прекрасна:
import numpy as np
target_shape = (350, 277)
arbitrary_array = np.random.normal(size = 96950)
reshaped_array = np.reshape(arbitrary_array, target_shape)
Однако, если вместо массива формы (96950), у меня есть набор кортежей с 3 элементами каждый (96950,3), я получил
cannot reshape array of size 290850 into shape (350,277)
Здесь код для репликации ошибки
array_of_tuple = np.array([(el, el, el) for el in arbitrary_array])
reshaped_array = np.reshape(array_of_tuple, target_shape)
Я предполагаю, что то, что делает изменение, - это сглаживание массива кортежей (отсюда размер 290850), а затем попытка его изменения. Тем не менее, я бы хотел иметь массив кортежей в форме (350, 277), в основном игнорируя второе измерение и просто изменяя кортежи, поскольку они были скалярными. Есть ли способ достичь этого?
Вы можете переделать (350, 277, 3)
вместо:
>>> a = np.array([(x,x,x) for x in range(10)])
>>> a.reshape((2,5,3))
array([[[0, 0, 0],
[1, 1, 1],
[2, 2, 2],
[3, 3, 3],
[4, 4, 4]],
[[5, 5, 5],
[6, 6, 6],
[7, 7, 7],
[8, 8, 8],
[9, 9, 9]]])
Технически, результат не будет трехмерным массивом 350x277 из 3-х кортежей, но 3D-массивом 350x277x3, но ни один из ваших array_of_tuple
является фактическим "массивом кортежей", а 2D-массивом.
reshaped_array=np.reshape(array_of_tuple,(350,-1))
reshaped_array.shape
дает (350, 831)
Вы получаете ошибку из-за несоответствия номеров столбцов и номеров строк, которые охватывают все элементы массива
350*831= 290850 where as
350*277=96950
и, следовательно, numpy не знает, что делать с дополнительными элементами массива. Вы можете попытаться уменьшить исходный размер массива, чтобы уменьшить количество элементов. Если вы не хотите удалять элементы, тогда
reshape(350,277,3)
вариант
Ваша проблема np.array(iterable)
с неправильным представлением результата np.array(iterable)
, посмотрите на это
In [7]: import numpy as np
In [8]: np.array([(el, el, el) for el in (1,)])
Out[8]: array([[1, 1, 1]])
In [9]: _.shape
Out[9]: (1, 3)
и спросите себя, какая форма
array_of_tuple = np.array([(el, el, el) for el in np.random.normal(size = 96950)])
reshape
форму(350, 277, 3)
?