数组索引失败/异常行为

2024-10-02 00:43:02 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一些代码,旨在将三维列表转换为数组。从技术上讲,它的工作原理是我得到了一个三维数组,但是索引只在我不遍历其中一个维度时才起作用,如果我遍历了就不起作用。你知道吗

索引在这里起作用:

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调用允许代码在第二种情况下运行,或者将最后一行更改为print(arrayGPSDays[0][0,0])也会运行。你知道吗

在这两种情况下,在所有级别检查类型都会返回<class 'numpy.ndarray'>。你知道吗

我希望这个数组索引工作,如果可能的话-我遗漏了什么?你知道吗

以下是示例数据:

使用第一段代码生成的print(arrayGPSDays[0:2,0:2,0:2])匿名结果(这样索引就可以工作了!-但也导致arrayGPSDays[0]arrayGPSDays[1]相同:

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

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

Tags: 代码infornp情况数组arrayprint
2条回答

numpyarray构造函数可以处理任意维数的iterables。它们唯一的规定是它们不能是锯齿状的(即每个维度中的每个“行”必须具有相同的长度)。你知道吗

举个例子:

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根本不允许这样做。你知道吗

嗯。你知道吗

Isaac,你的代码有语法错误

在您的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):

我想它会解决你的问题,希望它能起作用!你知道吗

相关问题 更多 >

    热门问题