Ошибка индексации / нечетное поведение с массивом - PullRequest
0 голосов
/ 09 ноября 2018

У меня есть код, предназначенный для преобразования трехмерного списка в массив. Технически это работает так, что я получаю 3-мерный массив, но индексирование работает только тогда, когда я не выполняю итерацию по одному из измерений, и не работает, если я это делаю.

Индексация работает здесь:

listTempAllDays = []
for j in listGPSDays:
    listTempDay = []
    for i in listGPSDays[0]:
        arrayDay = np.array(i)
        listTempDay.append(arrayDay)
    arrayTemp = np.array(listTempDay)
    listTempAllDays.append(arrayTemp)

arrayGPSDays = np.array(listTempAllDays)
print(arrayGPSDays[0,0,0])

Здесь не работает:

listTempAllDays = []
for j in listGPSDays:
    listTempDay = []
    for i in j:
        arrayDay = np.array(i)
        listTempDay.append(arrayDay)
    arrayTemp = np.array(listTempDay)
    listTempAllDays.append(arrayTemp)

arrayGPSDays = np.array(listTempAllDays)
print(arrayGPSDays[0,0,0])

Разница между двумя частями кода заключается во внутреннем цикле for. Первый фрагмент кода также работает для всех элементов в listGPSDays (например, for i in listGPSDays[1]: и т. Д.).

Удаление последнего вызова печати позволяет выполнить код во втором случае, или же изменение последней строки на print(arrayGPSDays[0][0,0]) также выполняется.

В обоих случаях проверка типа на всех уровнях возвращает <class 'numpy.ndarray'>.

Я бы хотел, чтобы индексирование этого массива работало, если возможно - чего мне не хватает?

В качестве примера приведены следующие данные:

Анонимные результаты из print(arrayGPSDays[0:2,0:2,0:2]), сгенерированные с использованием первого фрагмента кода (чтобы индексирование работало!

    [[['1' '2']
      ['3' '4']]

     [['1' '2']
      ['3' '4']]]

Ответы [ 2 ]

0 голосов
/ 09 ноября 2018
Конструктор

numpy array может обрабатывать итерации произвольного размера. Единственное условие состоит в том, что они не могут быть неровными (то есть каждая «строка» в каждом измерении должна иметь одинаковую длину).

Вот пример:

In [1]: list_3d = [[['a', 'b', 'c'], ['d', 'e', 'f']], [['g', 'h',  'i'], ['j', 'k', 'l']]]

In [2]: import numpy as np

In [3]: np.array(list_3d)
Out[3]: 
array([[['a', 'b', 'c'],
        ['d', 'e', 'f']],

       [['g', 'h', 'i'],
        ['j', 'k', 'l']]], dtype='<U1')

In [4]: array_3d = np.array(list_3d)

In [5]: array_3d[0,0,0]
Out[5]: 'a'

In [6]: array_3d.shape
Out[6]: (2, 2, 3)

Если массив имеет значение с зубчатыми краями, numpy будет "сдавливаться" до размера, в котором возникает зубчатая ность. Поскольку это объяснение ясно как грязь, пример может помочь:

In [20]: jagged_3d = [ [['a', 'b'], ['c', 'd']], [['e', 'f'], ['g', 'h'], ['i', 'j']] ]

In [21]: jagged_arr = np.array(jagged_3d)

In [22]: jagged_arr.shape
Out[22]: (2,)

In [23]: jagged_arr
Out[23]: 
array([list([['a', 'b'], ['c', 'd']]),
       list([['e', 'f'], ['g', 'h'], ['i', 'j']])], dtype=object)

Причина, по которой конструктор не работает "из коробки", заключается в том, что у вас есть зубчатый массив. numpy просто не поддерживает зубчатые массивы из-за того, что каждый массив numpy имеет четко определенный shape, представляющий длину каждого измерения. Поэтому, если элементы в данном измерении имеют разную длину, эта абстракция распадается, и numpy просто не позволяет этого.

НТН.

0 голосов
/ 09 ноября 2018

Итак, Исаак, кажется, ваш код имеет некоторые неверные интерпретации синтаксиса,

В вашем выражении for, j представляет ПУНКТ внутри списка listGPSDays (я предполагаю, что это список), а не ПУНКТ ПУНКТА внутри списка, и вам не нужно "получать" диапазон списка, python может сделать это самостоятельно, попробуйте:

for j in listGPSdays:

вместо

for j in range(len(listGPSDays)):

Также попробуйте изменить эту строку кода с:

for i in listGPSDays[j]:

до:

for i in listGPSDays.index(j):

Я думаю, что это решит вашу проблему, надеюсь, это сработает!

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