Aku punya besar numpy array yang saya butuhkan untuk memanipulasi sehingga masing-masing elemen berubah menjadi baik 1 atau 0 jika suatu kondisi terpenuhi (akan digunakan sebagai pixel masker kemudian). Ada sekitar 8 juta elemen dalam array dan saya saat ini metode memakan waktu terlalu lama untuk pengurangan pipa:
for (y,x), value in numpy.ndenumerate(mask_data):
if mask_data[y,x]<3: #Good Pixel
mask_data[y,x]=1
elif mask_data[y,x]>3: #Bad Pixel
mask_data[y,x]=0
Apakah ada numpy fungsi yang akan mempercepat ini?
>>> import numpy as np
>>> a = np.random.randint(0, 5, size=(5, 4))
>>> a
array([[4, 2, 1, 1],
[3, 0, 1, 2],
[2, 0, 1, 1],
[4, 0, 2, 3],
[0, 0, 0, 2]])
>>> b = a < 3
>>> b
array([[False, True, True, True],
[False, True, True, True],
[ True, True, True, True],
[False, True, True, False],
[ True, True, True, True]], dtype=bool)
>>>
>>> c = b.astype(int)
>>> c
array([[0, 1, 1, 1],
[0, 1, 1, 1],
[1, 1, 1, 1],
[0, 1, 1, 0],
[1, 1, 1, 1]])
Anda dapat mempersingkat ini dengan:
>>> c = (a < 3).astype(int)
>>> a = np.random.randint(0, 5, size=(5, 4))
>>> a
array([[0, 3, 3, 2],
[4, 1, 1, 2],
[3, 4, 2, 4],
[2, 4, 3, 0],
[1, 2, 3, 4]])
>>>
>>> a[a > 3] = -101
>>> a
array([[ 0, 3, 3, 2],
[-101, 1, 1, 2],
[ 3, -101, 2, -101],
[ 2, -101, 3, 0],
[ 1, 2, 3, -101]])
>>>
Lihat, misalnya, Pengindeksan dengan boolean array.
The tercepat (dan paling fleksibel) cara adalah dengan menggunakan np.di mana, yang memilih antara dua array sesuai untuk masker(array yang benar dan nilai-nilai palsu):
import numpy as np
a = np.random.randint(0, 5, size=(5, 4))
b = np.where(a<3,0,1)
print('a:',a)
print()
print('b:',b)
yang akan menghasilkan:
a: [[1 4 0 1]
[1 3 2 4]
[1 0 2 1]
[3 1 0 0]
[1 4 0 1]]
b: [[0 1 0 0]
[0 1 0 1]
[0 0 0 0]
[1 0 0 0]
[0 1 0 0]]
Anda dapat membuat masker array dalam satu langkah seperti ini
mask_data = input_mask_data < 3
Hal ini menciptakan sebuah boolean array yang kemudian dapat digunakan sebagai pixel masker. Perhatikan bahwa kita belum't mengubah input array (seperti dalam kode anda) tetapi telah menciptakan sebuah array baru untuk memegang masker data - saya akan merekomendasikan melakukannya dengan cara ini.
>>> input_mask_data = np.random.randint(0, 5, (3, 4))
>>> input_mask_data
array([[1, 3, 4, 0],
[4, 1, 2, 2],
[1, 2, 3, 0]])
>>> mask_data = input_mask_data < 3
>>> mask_data
array([[ True, False, False, True],
[False, True, True, True],
[ True, True, False, True]], dtype=bool)
>>>
Saya tidak yakin saya mengerti pertanyaan anda, tapi jika anda menulis:
mask_data[:3, :3] = 1
mask_data[3:, 3:] = 0
Ini akan membuat semua nilai-nilai dari masker data dan x dan y indeks kurang dari 3 untuk menjadi sama dengan 1 dan semua sisanya sama dengan 0