一次更改一个数组值

时间:2018-11-26 20:02:13

标签: python arrays python-3.x numpy

我试图一次翻转一个二进制数组。

import numpy as np
k = np.array([0, 0, 1, 1, 0, 1, 0, 0, 1, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 1])

例如我的输出应该是这样;

[1, 0, 1, 1, 0, 1, 0, 0, 1, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 1] # 1st output
[0, 1, 1, 1, 0, 1, 0, 0, 1, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 1] # 2nd output
[0, 0, 0, 1, 0, 1, 0, 0, 1, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 1] # 3rd output
[0, 0, 1, 0, 0, 1, 0, 0, 1, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 1] # 4th output
[0, 0, 1, 1, 1, 1, 0, 0, 1, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 1] # 5th output

在第一个输出中,我只想翻转数组的第一个元素(其他元素不改变),在第二个输出中,第二个元素应该改变(第一个元素和其余元素不改变)。等等 谁能告诉我一次如何翻转?谢谢

2 个答案:

答案 0 :(得分:1)

您所描述的是翻转数组的平铺版本的对角线。通过堆叠数组,您可以使用矢量化操作一次对整个数组进行操作,而不必分别对每一行进行操作。

设置

arr = np.tile(k, 5).reshape(-1, k.shape[0])

array([[0, 0, 1, 1, 0, 1, 0, 0, 1, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 1],
       [0, 0, 1, 1, 0, 1, 0, 0, 1, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 1],
       [0, 0, 1, 1, 0, 1, 0, 0, 1, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 1],
       [0, 0, 1, 1, 0, 1, 0, 0, 1, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 1],
       [0, 0, 1, 1, 0, 1, 0, 0, 1, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 1]])

使用numpy.diag_indices

x, y = np.diag_indices(arr.shape[0])
arr[x, y] = 1 - arr[x, y]

array([[1, 0, 1, 1, 0, 1, 0, 0, 1, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 1],
       [0, 1, 1, 1, 0, 1, 0, 0, 1, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 1],
       [0, 0, 0, 1, 0, 1, 0, 0, 1, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 1],
       [0, 0, 1, 0, 0, 1, 0, 0, 1, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 1],
       [0, 0, 1, 1, 1, 1, 0, 0, 1, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 1]])

答案 1 :(得分:1)

您可以使用生成器来节省大阵列上的内存,甚至节省时间:

k=np.array([0, 0, 1])

def flip_one(k):
    k[0]=1-k[0]
    yield k
    for i in range(len(k)):
        k[i:i+2]=1-k[i:i+2]
        yield k

for f in flip_one(k) : 
    print (f) # or other useful things!
#[1 0 1]
#[0 1 1]
#[0 0 0]
#[0 0 1]

k在循环结束时被重置。