как изменить массив кортежей

1

Мне нужно преобразовать массивы 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), в основном игнорируя второе измерение и просто изменяя кортежи, поскольку они были скалярными. Есть ли способ достичь этого?

  • 2
    Вы пробовали reshape форму (350, 277, 3) ?
  • 0
    изменить на (350, 277, 3)
Теги:
numpy
reshape

3 ответа

1
Лучший ответ

Вы можете переделать (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-массивом.

1
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)

вариант

1

Ваша проблема 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)])

Ещё вопросы

Сообщество Overcoder
Наверх
Меню