как изменить массив кортежей - PullRequest
0 голосов
/ 03 сентября 2018

Мне нужно изменить массив массивов, чтобы отобразить некоторые данные. Следующие отлично работают:

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)

Я думаю, что то, что делает rehape, это выравнивание массива кортежей (отсюда размер 290850) и затем попытка изменить его. Тем не менее, я хотел бы иметь массив кортежей в форме (350, 277), в основном игнорируя второе измерение и просто изменяя форму кортежей, поскольку они были скалярными. Есть ли способ достичь этого?

Ответы [ 3 ]

0 голосов
/ 03 сентября 2018
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)

это опция

0 голосов
/ 03 сентября 2018

Ваша проблема выходит из неверного представления о результате 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)])
0 голосов
/ 03 сентября 2018

Вы можете изменить форму на (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]]])

Технически, результатом будет не 2D-массив 350x277 из 3-х кортежей, а 3D-массив 350x277x3, хотя и не ваш array_of_tuple настоящий "массив кортежей", а 2D-массив.

...