使用阵列对失败/奇数行为编制索引

时间:2018-11-09 12:23:23

标签: python arrays list numpy indexing

我有一些代码旨在将3维列表转换为数组。从技术上讲,它的工作原理是获得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])的匿名结果(以便编制索引!-还会导致arrayGPSDays[0]arrayGPSDays[1]相同):

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

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

2 个答案:

答案 0 :(得分:1)

numpy的{​​{1}}构造函数可以处理任意大小的可迭代对象。它们仅规定它们不能锯齿状(即,每个维度中的每个“行”必须具有相同的长度)。

这是一个例子:

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

HTH。

答案 1 :(得分:0)

以撒,看来您的代码对语法有误解,

在您的def impl(c: Context)(annottees: c.Expr[Any]*): c.Expr[Any] = { import c.universe._ val inputs = annottees.map(_.tree).toList val module = inputs.head match { case x: ModuleDef => Some(x) case _ => None } module.foreach { m => //Get the fully qualified name of "m" and perform some side effects during compilation ??? } annottees.head 语句中,for代表列表j(我假设它是一个列表)内的一个ITEM,而不是列表内的ITEM INDEX,并且您不需要“获取”列表的范围,python可以自己完成,请尝试:

listGPSDays

代替

for j in listGPSdays:

此外,请尝试从以下位置更改此代码行:

for j in range(len(listGPSDays)):

收件人:

for i in listGPSDays[j]:

我认为它将解决您的问题,希望它能起作用!