NumPy Неправильная форма элементов для внутреннего прямоугольного массива непрямоугольного массива - PullRequest
0 голосов
/ 21 января 2019

В следующем коде ниже я создаю массив, состоящий из двух разных массивов. В этом примере кода имитируются данные исходной задачи, поэтому существует два разных массива, к которым осуществляется доступ таким образом. Как только массив был построен, преобразован в numy и транспонирован, я хочу получить доступ только ко второму списку. Однако, как только у меня есть этот второй список, он состоит из объектов списка, несмотря на то, что он прямоугольный (значения имеют формат (10,5)) Кто-нибудь знает, почему это происходит? Есть ли способ избежать этого, продолжая обращаться к данным таким способом?

big_array = []

big_array.append([[0, 0],[0,0,0,0,0]])
big_array.append([[0, 0],[0,0,0,0,0]])
big_array.append([[0, 0],[0,0,0,0,0]])
big_array.append([[0, 0],[0,0,0,0,0]])
big_array.append([[0, 0],[0,0,0,0,0]])
big_array.append([[0, 0],[0,0,0,0,0]])
big_array.append([[0, 0],[0,0,0,0,0]])
big_array.append([[0, 0],[0,0,0,0,0]])
big_array.append([[0, 0],[0,0,0,0,0]])
big_array.append([[0, 0],[0,0,0,0,0]])

big_array = np.asarray(big_array).transpose()
eval_array = big_array[1]
print(eval_array)
print(eval_array.shape)

Вот вывод отпечатков:

[list([0, 0, 0, 0, 0]) list([0, 0, 0, 0, 0]) list([0, 0, 0, 0, 0])
 list([0, 0, 0, 0, 0]) list([0, 0, 0, 0, 0]) list([0, 0, 0, 0, 0])
 list([0, 0, 0, 0, 0]) list([0, 0, 0, 0, 0]) list([0, 0, 0, 0, 0])
 list([0, 0, 0, 0, 0])]
(10,)

Очевидно, что массив в вышеприведенном выводе является прямоугольным, но я полагаю, что он не был распознан как таковой.

Ответы [ 2 ]

0 голосов
/ 21 января 2019

Вы утверждаете, что "Ясно, что массив прямоугольный", но это не так:)

Посмотрите на это [[0,0],[0,0,0,0,0]]. Это одномерный массив, который содержит:

  • массив с 2 элементами
  • массив с 5 элементами

Это не прямоугольник.

[[0,0],[0,0],[0,0],[0,0],[0,0]] (5,2) или [[0,0,0,0,0],[0,0,0,0,0]] (2,5).

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

big_array = []

big_array.append([[0,0,0,0,0],[0,0,0,0,0]])
big_array.append([[0,0,0,0,0],[0,0,0,0,0]])
big_array.append([[0,0,0,0,0],[0,0,0,0,0]])
big_array.append([[0,0,0,0,0],[0,0,0,0,0]])
big_array.append([[0,0,0,0,0],[0,0,0,0,0]])
big_array.append([[0,0,0,0,0],[0,0,0,0,0]])
big_array.append([[0,0,0,0,0],[0,0,0,0,0]])
big_array.append([[0,0,0,0,0],[0,0,0,0,0]])
big_array.append([[0,0,0,0,0],[0,0,0,0,0]])
big_array.append([[0,0,0,0,0],[0,0,0,0,0]])

np_arr = np.array(big_array)
np_arr.shape
> (10, 2, 5)
0 голосов
/ 21 января 2019

При инициализации массива, который не является прямоугольником, элементы являются объектами.При транспонировании этого представления, даже если внутренние элементы будут прямоугольными, NumPy сохранит тип объекта для этих массивов.Причина, по которой вы видите то, что видите, состоит в том, что вы транспонировали массив объектов и в результате получили массив объектов.

Можно получить правильную форму с помощью следующего кода:

np.asarray(eval_array.tolist())

Чтобы избежать этого, нужно начать с прямоугольного массива.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...