更简单的代码将多个列表组合成一个数组?我实际上希望“列表”仍然是该阵列中的“列表”

时间:2015-06-20 09:26:57

标签: python numpy

我有一个类似于thisthat的问题,但这些问题的解决方案是所有列表都“缺乏”“差异化”。

我的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))

我只是想知道是否有任何简化的代码来完成这项工作?

1 个答案:

答案 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,我们就会陷入某种形式的迭代。