6

给定一个数组,

>>> n = 2
>>> a = numpy.array([[[1,1,1],[1,2,3],[1,3,4]]]*n)
>>> a
array([[[1, 1, 1],
        [1, 2, 3],
        [1, 3, 4]],

       [[1, 1, 1],
        [1, 2, 3],
        [1, 3, 4]]])

我知道可以像这样简洁地替换其中的值,

>>> a[a==2] = 0
>>> a
array([[[1, 1, 1],
        [1, 0, 3],
        [1, 3, 4]],

       [[1, 1, 1],
        [1, 0, 3],
        [1, 3, 4]]])

是否可以对数组中的整行(最后一个轴)执行相同的操作?我知道这a[a==[1,2,3]] = 11将起作用并将匹配子数组的所有元素替换为 11,但我想替换一个不同的子数组。我的直觉告诉我要写以下内容,但结果是错误的,

>>> a[a==[1,2,3]] = [11,22,33]
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
ValueError: array is not broadcastable to correct shape

总之,我想得到的是:

array([[[1, 1, 1],
        [11, 22, 33],
        [1, 3, 4]],

       [[1, 1, 1],
        [11, 22, 33],
        [1, 3, 4]]])

...当然,一般来说,n 比 2 大很多,其他轴也比 3 大,所以如果我不需要的话,我不想循环它们。


更新:([1,2,3]或我正在寻找的其他任何东西)并不总是在索引 1。一个例子:

a = numpy.array([[[1,1,1],[1,2,3],[1,3,4]], [[1,2,3],[1,1,1],[1,3,4]]])
4

3 回答 3

3

np.all您可以通过检查所有列是否具有True用于比较的值,然后使用创建的掩码替换值来实现更高的性能:

mask = np.all(a==[1,2,3], axis=2)
a[mask] = [11, 22, 23]

print(a)
#array([[[ 1,  1,  1],
#        [11, 22, 33],
#        [ 1,  3,  4]],
# 
#       [[ 1,  1,  1],
#        [11, 22, 33],
#        [ 1,  3,  4]]])
于 2014-03-23T12:05:51.350 回答
2

你必须做一些更复杂的事情来实现你想要的。

您不能像这样选择数组切片,但可以选择所需的所有特定索引。

因此,首先您需要构造一个表示您希望选择的行的数组。IE。

data = numpy.array([[1,2,3],[55,56,57],[1,2,3]])

to_select = numpy.array([1,2,3]*3).reshape(3,3) # three rows of [1,2,3]

selected_indices = data == to_select
# array([[ True,  True,  True],
#        [False, False, False],
#        [ True,  True,  True]], dtype=bool)

data = numpy.where(selected_indices, [4,5,6], data)
# array([[4, 5, 6],
#        [55, 56, 57],
#        [4, 5, 6]])

# done in one step, but perhaps not very clear as to its intent
data = numpy.where(data == numpy.array([1,2,3]*3).reshape(3,3), [4,5,6], data)

numpy.where如果为真,则从第二个参数中选择,如果为假,则从第三个参数中选择。

您可以使用 where 从 3 种不同类型的数据中进行选择。第一个是一个与 具有相同形状的数组,selected_indices第二个只是一个单独的值(如 2 或 7)。第一个是最复杂的,因为它的形状可以广播成与 相同的形状selected_indices。在这种情况下,我们提供[1,2,3]了可以堆叠在一起以获得形状为 3x3 的数组。

于 2012-06-05T09:26:59.490 回答
0

请注意,如果这是您想要的,您的代码示例不会创建您所说的数组。但:

>>> a = np.array([[[1,1,1],[1,2,3],[1,3,4]], [[1,1,1],[1,2,3],[1,3,4]]])
>>> a
array([[[1, 1, 1],
        [1, 2, 3],
        [1, 3, 4]],

       [[1, 1, 1],
        [1, 2, 3],
        [1, 3, 4]]])
>>> a[:,1,:] = [[8, 8, 8], [8,8,8]]
>>> a
array([[[1, 1, 1],
        [8, 8, 8],
        [1, 3, 4]],

       [[1, 1, 1],
        [8, 8, 8],
        [1, 3, 4]]])
>>> a[:,1,:] = [88, 88, 88]
>>> a
array([[[ 1,  1,  1],
        [88, 88, 88],
        [ 1,  3,  4]],

       [[ 1,  1,  1],
        [88, 88, 88],
        [ 1,  3,  4]]])
于 2012-06-05T08:39:28.570 回答