我有一些代码旨在将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']]]
答案 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]:
我认为它将解决您的问题,希望它能起作用!