我有一个类似于this和that的问题,但这些问题的解决方案是所有列表都“缺乏”“差异化”。
我的Python代码如下:
y = np.empty([1,len(test)])
count = -1
for feature in test :
N = engine.neighbours(np.asarray(feature))
if len(N) != 4096:
print "error"
continue
count = count + 1
y [count] = engine.neighbours(np.asarray(feature))
我只是想知道是否有任何简化的代码来完成这项工作?
答案 0 :(得分:0)
链接的问题与展平列表列表有关。在你的代码中,你正在处理一个列表列表(我在猜测),过滤掉一些列表,并在二维数组中收集剩余的列表。
糟糕! y
初始化为1行,但您尝试将值放在y[count]
中,其中count
可能会增加到test
的大小。
y = np.empty([1,len(test)])
count = -1
# I would prefer to start with 0, but thats a style issue
for feature in test :
N = engine.neighbours(np.asarray(feature))
# so engine.neighbors requires an array; and returns an array?
if len(N) != 4096:
print "error"
continue
count = count + 1
y [count] = engine.neighbours(np.asarray(feature))
# why call neighbors again? why not reuse N?
以递增方式创建数组的常用方法是:
alist = []
for feature in tests:
N = engine.neighbors(np.array(feature)
# test N length
alist.append(N)
y = np.array(alist)
由于通过长度测试,所有N
具有相同的长度,结果数组将为2d,形状为(n,4096)
,其中n
是具有正确长度的测试数。
将y
初始化为np.empty((length(tests),4096)]
,插入y[count,:] = N
可能会更快。如果某些行未通过长度测试,您可能会得到未填充的行,但您可以删除它们。
将y
初始化为np.empty((1,4096)]
,并插入y=np.append(y,N)
也应该有效。请注意,此append
与列表追加不同。而且速度慢。我希望人们直接使用concatenate
:
y = np.concatenate([y, N[None,:]], axis=0)
连接是明确的,并且所需的维度操作清晰。
要制作1d数组数组,您必须执行以下操作:
y=np.empty((4,),dtype=object)
for i in range(len(y)):
y[i]=np.arange(i,2*i)
制造
array([array([], dtype=int32), array([1]), array([2, 3]), array([3, 4, 5])], dtype=object)
可以说比
生成的y
列表多一点
y=[]
for i in range(4):
y.append(np.arange(i,2*i))
在所有这些中,我假设engine.neighbors()
采用1d数组,并返回1d数组。如果获得/返回了多个feature
,我们可以“矢量化”事物。但只要我们一次只能给它一个feature
,我们就会陷入某种形式的迭代。