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 语句。

4

2 回答 2

1

您可以使用Numpy slice notation轻松做到这一点。是一个很好的答案的问题,可以清楚地解释它。本质上,您需要确保左侧数组和右侧数组的形状匹配,您可以通过对相应数组进行适当的切片来实现这一点。

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

您似乎想用第二个二维数组中的元素替换二维数组左上角的元素,而不用担心数组的大小。这是一个方法:

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)
于 2013-01-19T19:40:19.027 回答
1

问题是相等运算符正在制作数组的浅拷贝,而您想要的是数组的一部分的深层拷贝。

所以为此,如果你知道 b 只有一个外部数组,那么你可以这样做:

a[0] = b

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

a = c[0:3]

此外,如果您希望它们成为实际的深层副本,您将需要:

a[0] = b.copy()

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

让他们独立。

如果您还不知道矩阵的长度,可以使用该len()函数在运行时找出。

于 2013-01-19T19:41:14.273 回答