我在NumPy的以下數組: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 ]
謝謝!
我在NumPy的以下數組: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:該任擇議定書要求的意見如何計算
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 broadcast up up d[np.newaxis,:]
and d[:,np.newaxis]
to shape(3,3),copy appropriate values as appropriate。
n=d[np.newaxis,:] + d[:,np.newaxis] + 2*l
print(n)
# [[ 0 6 12]
# [10 16 22]
# [20 26 32]]
EDIT1:通常你不需要形成B
或C
。 Numpy廣播的目的是讓您使用A
來代替B
或C
。如果您告訴我們您打算如何使用B
或C
,我們可能會告訴您如何使用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
,而不是副本(如上述解決方案)。更改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])
很老的線程,但以防萬一有人問津......
C,B = np.meshgrid(A,A)
我想計算'N(I,J)= 1(I, i)+ l(j,j) - 2 * l(i,j)'對於所有i,j並且得到矩陣N的結果 – yassin 2010-09-06 12:28:31
非常感謝您的完整答案! – yassin 2010-09-06 14:38:43
++對於i,j = ogrid [...],一般方法。 (你有沒有想過要收集你的優秀帖子,例如在scipy.org/Cookbook下?) – denis 2010-09-08 09:31:49