关于python:将多个列表组合成一个数组的简单代码?我真希望”列表”仍然是那个数组中的”列表”

Simpler code to combine multiple lists into one array? I actually wish “lists” are still “lists” in that array

我有一个类似于这个和那个的问题,但是解决这些问题的方法是所有的列表都是"统一的",缺乏"差异化"。

我的python代码如下:

1
2
3
4
5
6
7
8
9
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))

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


链接的问题与扁平化列表有关。在您的代码中,您正在处理一个列表列表(我猜是这样),过滤掉一些列表,并将其余的列表收集到一个二维数组中。

哎呀!y初始化为1行,但您尝试在y[count]中放置值,其中count可以增加到test的大小。

1
2
3
4
5
6
7
8
9
10
11
12
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?

增量创建数组的一种常见方法是:

1
2
3
4
5
6
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与list append不同。慢一些。我更喜欢人们直接使用concatenate

1
y = np.concatenate([y, N[None,:]], axis=0)

连接是显式的,并且所需的维度操作是清晰的。

要创建一个一维数组,必须执行如下操作:

1
2
3
y=np.empty((4,),dtype=object)
for i in range(len(y)):
    y[i]=np.arange(i,2*i)

生产:

1
array([array([], dtype=int32), array([1]), array([2, 3]), array([3, 4, 5])], dtype=object)

可以说,这比由

1
2
3
y=[]
for i in range(4):
    y.append(np.arange(i,2*i))

在这一切中,我假设engine.neighbors()接受一个一维数组,并返回一个一维数组。如果采用/返回多个feature,我们可以"向量化"事物。但只要我们一次只能给它一个feature,我们就陷入了某种形式的迭代。