从FOR循环创建numpy数组的最佳方法

6

有没有更好的方法使用FOR循环在numpy中创建多维数组,而不是创建一个列表?这是我能想到的唯一方法:

import numpy as np

a = []
for x in range(1,6):
    for y in range(1,6):
        a.append([x,y])
a = np.array(a)
print(f'Type(a) = {type(a)}.  a = {a}')

编辑:我尝试做了这样的事情:

a = np.array([range(1,6),range(1,6)])
a.shape = (5,2)
print(f'Type(a) = {type(a)}.  a = {a}')

然而,输出结果并不相同。我确定我漏掉了一些基础知识。

你期望的输出是什么? - Georgy
你明白第二次尝试做了什么吗?即使它没有产生你想要的结果,理解那个表达式仍然很重要。 - hpaulj
4个回答

3
您可以在分配相应的值之前预先分配数组:
a = np.empty(shape=(25, 2), dtype=int)
for x in range(1, 6):
    for y in range(1, 6):
        index = (x-1)*5+(y-1)
        a[index] = x, y

1

1

你可以使用itertools.product代替双重for循环。

from itertools import product 
import numpy as np

np.array(list(product(range(1,6), range(1,6))))

对我来说,从列表中创建数组在这里看起来很自然。不知道在那种情况下如何跳过它们。

0
有时在选择数组元素阶段,由于循环内部的一些if语句,很难预测总元素数量和形状。
在这种情况下,将所有选定的元素放入平坦数组中:
a = np.empty((0), int)
for x in range(1,6):  # x-coordinate
    for y in range(1,6):  # y-coordinate
        if x!=y:  # `if` statement
            a = np.append(a, [x, y])

然后,鉴于一个数组维度的长度(在我们的情况下有2个坐标),可以使用-1表示未知的维度:

a.shape = (-1, 2)
a
array([[1, 2],
       [1, 3],
       [1, 4],
       [1, 5],
       [2, 1],
       [2, 3],
       [2, 4],
       [2, 5],
       [3, 1],
       [3, 2],
       [3, 4],
       [3, 5],
       [4, 1],
       [4, 2],
       [4, 3],
       [4, 5],
       [5, 1],
       [5, 2],
       [5, 3],
       [5, 4]])

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接