2013-01-19 46 views
0

...更好地直接显示代码。那就是:变量赋值:保持形状

import numpy as np 
a = np.zeros([3, 3]) 
a 
array([[ 0., 0., 0.], 
     [ 0., 0., 0.], 
     [ 0., 0., 0.]]) 
b = np.random.random_integers(0, 100, size = (1, 3)) 
b 
array([[ 10, 3, 8]]) 
c = np.random.random_integers(0, 100, size = (4, 3)) 
c 
array([[ 22, 21, 14], 
     [ 55, 64, 12], 
     [ 33, 85, 98], 
     [ 37, 44, 45]]) 
a = b will change dimensions of a 
a = c will change dimensions of a 

为A = B,我想:

array([[ 10., 3., 8.], 
     [ 0., 0., 0.], 
     [ 0., 0., 0.]]) 

和A = C,我想:

array([[ 22, 21, 14], 
     [ 55, 64, 12], 
     [ 33, 85, 98]]) 

所以我想锁定的形状'a',以便分配给它的值在必要时被“裁剪”。当然没有if语句。

+0

更新了我的答案以显示一般方法。 – fraxel

回答

1

您可以通过使用Numpy slice notation做到这一点很容易。 Here是一个很好的答案,很清楚地解释它。实质上,您需要确保左侧数组的形状和右侧的数组匹配,并且可以通过适当地切片对应的数组来实现此目的。

import numpy as np 
a = np.zeros([3, 3]) 
b = np.array([[ 10, 3, 8]]) 
c = np.array([[ 22, 21, 14], 
     [ 55, 64, 12], 
     [ 33, 85, 98], 
     [ 37, 44, 45]]) 

a[0] = b 
print a 
a = c[0:3] 
print a 

输出:

[[ 10. 3. 8.] 
[ 0. 0. 0.] 
[ 0. 0. 0.]] 
[[22 21 14] 
[55 64 12] 
[33 85 98]] 

看来要替换在与从第二2D阵列元件的2D阵列的左上角元件,无需担心阵列的尺寸。这里有一个方法:

def replacer(orig, repl): 
    new = np.copy(orig) 
    w2, h1 = new.shape 
    w1, h2 = repl.shape 
    new[0:min(w1,w2), 0:min(h1,h2)] = repl[0:min(w1,w2), 0:min(h1,h2)] 
    return new 
print replacer(a,b) 
print replacer(a,c) 
1

的问题是,运营商等正在使数组的一个浅表副本,你想要的是阵列的一部分的深层复制。

因此,对于这一点,如果你知道B只有一个外部阵列,那么你可以做:

a[0] = b 

如果知道,是一个3x3的,那么你也可以这样做:

a = c[0:3] 

此外,如果你想他们是实际的深层副本,你会想:

a[0] = b.copy() 

a = c[0:3].copy() 

为了让他们独立。

如果你已经不知道该矩阵的长度,你可以使用len()功能在运行时查找。

+0

问题是相等的操作符正在制作数组的浅表副本。实际上,equal运算符为Python中的对象指定一个名称,所以'a = b'使'a'和'b'指向同一个对象。 'a = b [:]'做一个浅拷贝。 –

+0

这不就是浅拷贝的定义吗?我的意思是,维基百科指出:'在这个(浅拷贝)过程中,B被附加到与A相同的内存块。“这就是为什么我说使用'copy()'函数来进行实际深度复制。 –

+0

考虑'a = [1,[2,3],4]; B = A'。 'b [0] = 5'会改变'a'和'b',因为它们是同一个对象。浅拷贝是'b = a [:]'。 'b [0] = 5'会改变b,但不是a,但是'b [1] [0] = 5'会改变两者。 'b'是'a'的浅拷贝,因为它是一个新的列表对象,但第二个元素是同一个子列表。你可以使用'id()'命令来验证这一点。 –