gpt4 book ai didi

python - Numpy 广播数组

转载 作者:行者123 更新时间:2023-11-28 19:59:35 27 4
gpt4 key购买 nike

我在 NumPy 中有以下数组:

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

如何获得以下矩阵(没有显式循环)?

B = [ 1 1 1
2 2 2
3 3 3 ]

C = [ 1 2 3
1 2 3
1 2 3 ]

谢谢!

最佳答案

Edit2:OP 在评论中询问如何计算

n(i, j) = l(i, i) + l(j, j) - 2 * l(i, j)

我可以想到两种方法。我喜欢这种方式,因为它很容易概括:

import numpy as np

l=np.arange(9).reshape(3,3)
print(l)
# [[0 1 2]
# [3 4 5]
# [6 7 8]]

想法是使用np.ogrid .这定义了两个 numpy 数组的列表,一个形状为 (3,1),一个形状为 (1,3):

grid=np.ogrid[0:3,0:3]
print(grid)
# [array([[0],
# [1],
# [2]]), array([[0, 1, 2]])]

grid[0]可以用作索引的代理 i , 和 grid[1]可以用作索引的代理 j .

所以表达式中到处都是l(i, i) + l(j, j) - 2 * l(i, j) ,您只需替换 i --> grid[0] , 和 j --> grid[1] ,而 numpy 广播负责其余的工作:

n=l[grid[0],grid[0]] + l[grid[1],grid[1]] + 2*l
print(n)
# [[ 0 6 12]
# [10 16 22]
# [20 26 32]]

但是,在这种特殊情况下,由于 l(i,i)l(j,j)只是 l 的对角线元素,你可以这样做:

d=np.diag(l)
print(d)
# [0 4 8]

d[np.newaxis,:]抽出 d 的形状到(1,3),和 d[:,np.newaxis]抽出 d 的形状到(3,1)。

Numpy 广播提升 d[np.newaxis,:]d[:,np.newaxis]塑造 (3,3),根据需要复制值。

n=d[np.newaxis,:] + d[:,np.newaxis] + 2*l
print(n)
# [[ 0 6 12]
# [10 16 22]
# [20 26 32]]

Edit1:通常你不需要形成BC . Numpy 广播的目的是让你使用 A代替 BC .如果您向我们展示您打算如何使用 BC ,我们也许可以向您展示如何对 A 执行相同的操作和 numpy 广播。


(原始答案):

In [11]: B=A.repeat(3).reshape(3,3)

In [12]: B
Out[12]:
array([[1, 1, 1],
[2, 2, 2],
[3, 3, 3]])

In [13]: C=B.T

In [14]: C
Out[14]:
array([[1, 2, 3],
[1, 2, 3],
[1, 2, 3]])

In [25]: C=np.tile(A,(3,1))

In [26]: C
Out[26]:
array([[1, 2, 3],
[1, 2, 3],
[1, 2, 3]])

In [27]: B=C.T

In [28]: B
Out[28]:
array([[1, 1, 1],
[2, 2, 2],
[3, 3, 3]])

来自肮脏的把戏部门:

In [57]: np.lib.stride_tricks.as_strided(A,shape=(3,3),strides=(4,0))
Out[57]:
array([[1, 1, 1],
[2, 2, 2],
[3, 3, 3]])

In [58]: np.lib.stride_tricks.as_strided(A,shape=(3,3),strides=(0,4))
Out[58]:
array([[1, 2, 3],
[1, 2, 3],
[1, 2, 3]])

但请注意,这些是 A View ,而不是副本(就像上面的解决方案一样)。改变 B , 改变 A :

In [59]: B=np.lib.stride_tricks.as_strided(A,shape=(3,3),strides=(4,0))

In [60]: B[0,0]=100

In [61]: A
Out[61]: array([100, 2, 3])

关于python - Numpy 广播数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3651099/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com