Saya sudah:

import numpy as np
a = np.array([[ 4, 99,  2],
              [ 3,  4, 99],
              [ 1,  8,  7],
              [ 8,  6,  8]])

Kenapa

a[[True, True, False, False], [1,2]]

Sama dengan

array([99, 99])

Dan tidak

array([99, 2],
      [4, 99])

Karena saya memilih dua baris pertama menggunakan topeng boolean dan kolom ke-2 dan ke-3 menggunakan pengindeksan mewah? Terutama sejak menelepon

a[[True, True, False, False],:][:, [1,2]]

Memberi saya hasil yang saya harapkan. Saya menduga ini semacam aturan penyiaran tetapi tidak jelas bagi saya. Terima kasih!

2
kuan 17 Maret 2017, 18:07

2 jawaban

Jawaban Terbaik

Larik atau daftar boolean dievaluasi seolah-olah where telah mengonversinya menjadi larik indeks:

In [285]: a[[True,True,False,False],[1,2]]
Out[285]: array([99, 99])

In [286]: a[np.where([True,True,False,False]),[1,2]]
Out[286]: array([[99, 99]])

In [287]: np.where([True,True,False,False])
Out[287]: (array([0, 1], dtype=int32),)

In [288]: a[[0,1], [1,2]]
Out[288]: array([99, 99])

Jadi ini adalah memilih a[0,1] dan a[1,2], pilihan 'berpasangan'.

Blok diindeks dengan array (atau daftar yang setara) yang disiarkan satu sama lain untuk menghasilkan array (2.2):

In [289]: a[np.ix_([0,1], [1,2])]
Out[289]: 
array([[99,  2],
       [ 4, 99]])
In [290]: a[[[0],[1]], [1,2]]
Out[290]: 
array([[99,  2],
       [ 4, 99]])

Kasus ini setara dengan pengindeksan 2 tahap: a[[0,1],:][:,[1,2]]

Saya menggunakan np versi 12. Ada beberapa perubahan dalam indeks boolean selama rilis terbaru. Misalnya, jika panjang boolean tidak tepat, boolean berjalan, tetapi memberikan peringatan (bagian ini baru).

In [349]: a[[True,True,False],[1,2]]
/usr/local/bin/ipython3:1: VisibleDeprecationWarning: boolean index did not match indexed array along dimension 0; dimension is 4 but corresponding boolean dimension is 3
  #!/usr/bin/python3
Out[349]: array([99, 99])

Perubahan untuk v 13 dijelaskan dalam:

https://docs.scipy.org/doc/numpy-dev/release.html#boolean-indexing-changes

4
hpaulj 17 Maret 2017, 18:38

Saya pikir itu berfungsi seperti berikut:

In [284]: a
Out[284]: 
array([[ 4, 99,  2],
       [ 3,  4, 99],
       [ 1,  8,  7],
       [ 8,  6,  8]])

In [286]: bo
Out[286]: array([ True,  True, False, False], dtype=bool)

In [287]: boc
Out[287]: array([1, 2])

Sekarang, setelah kita mengindeks a dengan topeng boolean bo, kita mendapatkan:

In [285]: a[bo]
Out[285]: 
array([[ 4, 99,  2],
       [ 3,  4, 99]])

Karena, bo bernilai [1, 1, 0, 0], ini hanya akan memilih dua baris pertama dari a.

Sekarang, kita menerapkan boc yaitu [1, 2] dalam kombinasi dengan baris yang memilih mask bo.

In [288]: a[bo, boc]
Out[288]: array([99, 99])

Di sini, mask boc diterapkan ke baris yang sudah diambil. Dan ia memilih elemen kedua dari baris pertama, elemen ketiga dari baris kedua menghasilkan [99, 99].

Tapi, menariknya jika Anda melakukan sesuatu seperti:

In [289]: a[1, [1, 2]]
Out[289]: array([ 4, 99])

Dalam hal ini, siaran numpy menghasilkan indeks [(1,1), (1,2)]

1
kmario23 17 Maret 2017, 16:00