使用列表推导式创建一个二维numpy数组。

3

我需要使用列表推导式创建一个二维的numpy数组,但它必须按照以下格式:

[[1, 2, 3],
 [2, 3, 4],
 [3, 4, 5],
 [4, 5, 6],
 [5, 6, 7]]]

到目前为止,我所弄清的仅有:

two_d_array = np.array([[x+1 for x in range(3)] for y in range(5)])

给定:

array([[1, 2, 3],
       [1, 2, 3],
       [1, 2, 3],
       [1, 2, 3],
       [1, 2, 3]])

不太确定如何更改增量。 感谢任何帮助!

编辑:意外地在示例中遗漏了[3,4,5]。 现在已包含。


1
尝试使用x + y而不是x + 1 - ForceBru
2
[3, 4, 5]在哪里? - roganjosh
@ForceBru 或许应该用 x + y + 1 而不是 x + 1 - norok2
你期望的数组中是否缺少了[3,4,5]这一行,还是它被有意地删除了? - Ehsan
抱歉,[3, 4, 5]被错误地遗漏了。 - ambrrrgris
你需要使用列表推导式吗?可以使用[1, 2, 3] + np.arange(5)[:, None] - user3483203
3个回答

1
更改代码,类似这样就可以工作:

two_d_array = np.array([[(y*3)+x+1 for x in range(3)] for y in range(5)])
>>> [[1,2,3],[4,5,6],...]
two_d_array = np.array([[y+x+1 for x in range(3)] for y in range(5)])
>>> [[1,2,3],[2,3,4],...]

1

Here's a quick one-liner that will do the job:

np.array([np.arange(i, i+3) for i in range(1, 6)])

其中3是每个数组中的列数或元素数量,6是要执行的迭代次数 - 在本例中,它是要创建的数组的数量;这就是为什么输出中有5个数组。

输出:

array([[1, 2, 3],
       [2, 3, 4],
       [3, 4, 5],
       [4, 5, 6],
       [5, 6, 7]])

1
啊,好的。还在适应所有不同的np函数。这个有效,谢谢! - ambrrrgris

1
你已经得到了一些好的理解答案,这里提供几个numpy解决方案。
简单加法:
np.arange(1, 6)[:, None] + np.arange(3)

疯狂的步幅技巧:

base = np.arange(1, 8)
np.lib.stride_tricks.as_strided(base, shape=(5, 3), strides=base.strides * 2).copy()

重新塑造的累积和:
base = np.ones(15)
base[3::3] = -1
np.cumsum(base).reshape(5, 3)

@S3DEV。修正了-1。你从问题中得到的9在哪里? - Mad Physicist

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