2010-09-06 66 views
2

我在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 ] 

謝謝!

回答

7

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:通常你不需要形成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,而不是副本(如上述解決方案)。更改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]) 

+0

我想計算'N(I,J)= 1(I, i)+ l(j,j) - 2 * l(i,j)'對於所有i,j並且得到矩陣N的結果 – yassin 2010-09-06 12:28:31

+0

非常感謝您的完整答案! – yassin 2010-09-06 14:38:43

+0

++對於i,j = ogrid [...],一般方法。 (你有沒有想過要收集你的優秀帖子,例如在scipy.org/Cookbook下?) – denis 2010-09-08 09:31:49

3

很老的線程,但以防萬一有人問津......

C,B = np.meshgrid(A,A)