изменение значения массива по одному - PullRequest
0 голосов
/ 26 ноября 2018

Я пытаюсь перевернуть двоичный массив по одному за раз.

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

В первом выводе яхотите перевернуть только первый элемент массива (другие элементы не меняются), во втором выводе второй элемент должен измениться (1-й и остальные элементы не должны измениться) .. и т.д. Может кто-нибудь сказать мне, как можно перевернутьодин за раз?Спасибо

Ответы [ 2 ]

0 голосов
/ 26 ноября 2018

Вы можете использовать генератор для экономии памяти и даже времени на больших массивах:

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 сбрасывается в конце цикла.

0 голосов
/ 26 ноября 2018

То, что вы описываете, - это перевернуть диагональ мозаичной версии вашего массива.Устанавливая массив в массив, вы можете работать со всем массивом одновременно, используя векторизованные операции, а не работать с каждой строкой по отдельности.

Настройка

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]])
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...