Một thay thế cho np.ix_
là để chuyển đổi các mảng boolean để nguyên mảng (sử dụng np.nonzero()
), sau đó sử dụng np.newaxis
để tạo các mảng có hình dạng phù hợp để tận dụng phát sóng.
import numpy as np
a=np.random.rand(10,20)
x_range=np.arange(10)
y_range=np.arange(20)
a_tmp=a[x_range<5,:]
b_correct=a_tmp[:,np.in1d(y_range,[3,4,8])]
m1=(x_range<5).nonzero()[0]
m2=np.in1d(y_range,[3,4,8]).nonzero()
b=a[m1[:,np.newaxis], m2]
assert np.allclose(b,b_correct)
b2=a[np.ix_(x_range<5,np.in1d(y_range,[3,4,8]))]
assert np.allclose(b2,b_correct)
np.ix_
có xu hướng chậm hơn lập chỉ mục kép. giải pháp Các dài hình thức dường như là nhanh hơn một chút:
dài dạng:
In [83]: %timeit a[(x_range<5).nonzero()[0][:,np.newaxis], (np.in1d(y_range,[3,4,8])).nonzero()[0]]
10000 loops, best of 3: 131 us per loop
đôi indexing:
In [85]: %timeit a[x_range<5,:][:,np.in1d(y_range,[3,4,8])]
10000 loops, best of 3: 144 us per loop
sử dụng np.ix_:
In [84]: %timeit a[np.ix_(x_range<5,np.in1d(y_range,[3,4,8]))]
10000 loops, best of 3: 160 us per loop
Lưu ý: Bạn nên kiểm tra những thời gian này trên máy của mình vì các thứ hạng có thể thay đổi tùy thuộc vào phiên bản Python, phần mềm hay phần cứng của bạn.
Nó thực sự không có ý nghĩa. Tôi sẽ hỏi trong maillist tại sao nó là theo cách này. – tillsten
[scipy.org/Cookbook/Indexing] (http://scipy.org/Cookbook/Indexing) p. 14 về chỉ số Boolean đa chiều cho biết "nhìn vào các công cụ mảng bị che khuất của numpy ... Cách tiếp cận rõ ràng không đưa ra câu trả lời đúng." (Tài liệu đó được viết tốt, cần cập nhật.) – denis
@denis, vào khoảng năm 2013 tài liệu đó giải thích rõ ràng. Tuy nhiên, nếu bạn google lập chỉ mục logic gumpy, tài liệu đi lên là http://docs.scipy.org/doc/numpy/reference/arrays.indexing.html và nó không được giải thích gần như là tốt. – John