2014-12-09 5 views
0

Я хочу изменить элементы, чтобы быть [0,0,0], если пиксель этого цвета синий. Приведенный ниже код работает, но очень медленно:Numpy меняет все элементы при условии на многомерном массиве

for row in range(w): 
    for col in range(h): 
     if np.array_equal(image[row][col], [255,0,0]): 
      image[row][col] = (0,0,0) 
     else: 
      image[row][col] = (255,255,255) 

Я знаю np.where работает для одномерных массивов, но как я могу использовать эту функцию, чтобы заменить материал для 3 мерного объекта?

ответ

2

Так как вы воспитывали numpy.where, это то, как вы могли бы сделать это с помощью nupmy.where:

import numpy as np 

# Make an example image 
image = np.random.randint(0, 255, (10, 10, 3)) 
image[2, 2, :] = [255, 0, 0] 

# Define the color you're looking for 
pattern = np.array([255, 0, 0]) 

# Make a mask to use with where 
mask = (image == pattern).all(axis=2) 
newshape = mask.shape + (1,) 
mask = mask.reshape(newshape) 

# Finish it off 
image = np.where(mask, [0, 0, 0], [255, 255, 255]) 

Reshape находится там так, что NumPy будет применяться broadcasting, more here also.

0

Простейшая вещь, которую вы могли бы сделать, это просто умножить элемент, который вы хотите установить на нулевой массив , ноль. Пример этого свойства массива для трехмерного массива показан ниже.

x = array([ [ [ 1,2,3 ] , [ 2 , 3 , 4 ] ] , [ [ 1, 2, 3, ] , [ 2 , 3 , 4 ] ] , [ [ 1,2,3 ] , [ 2 , 3 , 4 ] ] , [ [ 1, 2, 3, ] , [ 2 , 3 , 4 ] ] ]) 

print x 

if 1: 
    x[0] = x[0] * 0 

print x 

Это даст две распечатки:

[[[1 2 3] [2 3 4]]

[[1 2 3] [2 3 4]] .. .

и

[[[0 0 0] [0 0 0]]

[[1 2 3] [2 3 4]] ...

Этот метод будет работать как для изображения [row], так и для изображения [row] [column] в вашем примере. Ваш пример переработан будет выглядеть следующим образом:

for row in range(w): 
    for col in range(h): 
     if np.array_equal(image[row][col], [255,0,0]): 
      image[row][col] = 0 
     else: 
      image[row][col] = 255 
+0

Это не помогает, проблема все та же, что для циклов еще два, поэтому его чрезвычайно медленный – user1835351

Смежные вопросы