Sử dụng gấu trúc, bạn có thể sử dụng
>>> np.any[np.in1d[a1, a2]]
True
6:a1 = np.array[[10,5,4,13,10,1,1,22,7,3,15,9]]
a2 = np.array[[3,4,9,10,13,15,16,18,19,20,21,22,23]]
>>> pd.Series[a1].isin[a2].any[]
True
Và sử dụng chức năng Numpy In1D [theo bình luận từ @norman]:
>>> np.any[np.in1d[a1, a2]]
True
Đối với các mảng nhỏ như trong ví dụ này, giải pháp sử dụng Set là người chiến thắng rõ ràng. Đối với các mảng lớn hơn, không giống nhau [tức là không có sự chồng chéo], các giải pháp gấu trúc và numpy nhanh hơn. Tuy nhiên,
>>> np.any[np.in1d[a1, a2]]
True
7 dường như xuất sắc cho các mảng lớn hơn.Mảng nhỏ [12-13 yếu tố]
%timeit set[array1] & set[array2]
The slowest run took 4.22 times longer than the fastest. This could mean that an intermediate result is being cached
1000000 loops, best of 3: 1.69 µs per loop
%timeit any[i in a1 for i in a2]
The slowest run took 12.29 times longer than the fastest. This could mean that an intermediate result is being cached
100000 loops, best of 3: 1.88 µs per loop
%timeit np.intersect1d[a1, a2]
The slowest run took 10.29 times longer than the fastest. This could mean that an intermediate result is being cached
100000 loops, best of 3: 15.6 µs per loop
%timeit np.any[np.in1d[a1, a2]]
10000 loops, best of 3: 27.1 µs per loop
%timeit pd.Series[a1].isin[a2].any[]
10000 loops, best of 3: 135 µs per loop
Sử dụng một mảng có các phần tử 100K [không chồng chéo]::
a3 = np.random.randint[0, 100000, 100000]
a4 = a3 + 100000
%timeit np.intersect1d[a3, a4]
100 loops, best of 3: 13.8 ms per loop
%timeit pd.Series[a3].isin[a4].any[]
100 loops, best of 3: 18.3 ms per loop
%timeit np.any[np.in1d[a3, a4]]
100 loops, best of 3: 18.4 ms per loop
%timeit set[a3] & set[a4]
10 loops, best of 3: 23.6 ms per loop
%timeit any[i in a3 for i in a4]
1 loops, best of 3: 34.5 s per loop
Đọc 3 phút
Trong bài viết này, chúng ta sẽ thấy các chức năng tiện lợi có thể được sử dụng để kiểm tra xem các phần tử của mảng 1D có tồn tại trong một mảng 2D khác hay không
Chúng tôi sẽ chỉ làm theo các bước này để kiểm tra các yếu tố đó thuộc về một mảng khác:
- Tạo mảng 1D [x] và mảng 2D [y]
- Sử dụng numpy.isin [] để trả về một mảng boolean có hình dạng giống như y đúng trong đó một phần tử của y ở x và sai nếu không
- Sử dụng numpy.in1d [] để kiểm tra xem mỗi phần tử của mảng 1-d cũng có mặt trong một mảng thứ hai y
- Chỉ số của y nơi các phần tử khớp với mảng 1D x
Bắt đầu nào
Tạo mảng 1D x và 2D y
Hãy để tạo ra một mảng 1D X bằng cách sử dụng ngẫu nhiên numpy để tạo các số nguyên ngẫu nhiên có kích thước 4 và tạo một mảng 2D thứ hai với các số nguyên ngẫu nhiên có hình dạng 4x4
x = np.random.randint[0, 9, size=[4]]
x
y=np.random.randint[0, 9, size=[4, 4]]
y
Out:
array[[[5, 8, 7, 8],
[3, 2, 2, 3],
[6, 0, 3, 7],
[8, 6, 0, 3]]]
Chúng tôi sẽ kiểm tra xem các phần tử trong x thuộc về mảng y hay không
Sử dụng numpy.isin [] để tìm các phần tử trong mảng 1D x tồn tại trong mảng 2d y
numpy.isin [] là phiên bản hàm yếu tố của từ khóa Python trong. Nó tính toán phần tử trong Array X, chỉ phát trên mảng 2D y. Trả về một mảng boolean có hình dạng giống như mảng 2D y đúng trong đó một phần tử của phần tử trong mảng 1D
Trong mảng boolean đầu ra, bạn có thể thấy tất cả các vị trí mà các phần tử từ mảng 1D tồn tại được đặt là đúng và sai nếu không
Out:
array[[[False, False, True, False],
[False, True, True, False],
[ True, False, False, True],
[False, True, False, False]]]
Bạn cũng có thể đảo ngược thử nghiệm bằng cách đặt tham số đảo ngược thành true
np.isin[Y, X, invert=True]
Out:
array[[[ True, True, False, True],
[ True, False, False, True],
[False, True, True, False],
[ True, False, True, True]]]
Chúng ta cũng có thể kiểm tra tất cả các phần tử trong mảng 2D y thuộc về mảng 1D X bằng cách chỉ thay đổi vị trí của x và y trong hàm isin []. Trong trường hợp này, một mảng 1D của hình x được trả về
>>> np.any[np.in1d[a1, a2]]
True
0Sử dụng numpy.in1d [] để tìm các phần tử trong mảng 1D x tồn tại trong mảng 2d y
numpy.in1d [] kiểm tra xem mỗi phần tử của mảng 1-D cũng có mặt trong một mảng thứ hai.
Trả về một mảng boolean cùng độ dài với x là đúng trong đó một phần tử của x trong y và sai.
Tài liệu chính thức Numpy khuyến nghị sử dụng isin [] trên in1d []
>>> np.any[np.in1d[a1, a2]]
True
0Tìm chỉ số các phần tử của mảng 1D x trong mảng 2D y
Chúng tôi đã thấy tất cả các chức năng cung cấp cho chúng tôi một mảng boolean để kiểm tra xem phần tử của một mảng có tồn tại trong một mảng khác hay không.
Tiếp theo là gì? Làm thế nào bạn có thể tìm thấy các chỉ số của tất cả các yếu tố đó trong mảng 1D trong mảng 2D
Bạn có thể sử dụng numpy.where [] cùng với numpy.isin [] như được hiển thị bên dưới
>>> np.any[np.in1d[a1, a2]]
True
2Hoặc, vượt qua đầu ra boolean của numpy.isin [] trong numpy.nonzero [] để trả về chỉ số của các phần tử trong mảng 2D y phù hợp với phần tử trong mảng 1D x
>>> np.any[np.in1d[a1, a2]]
True
3Out:
array[[[False, False, True, False],
[False, True, True, False],
[ True, False, False, True],
[False, True, False, False]]]
Nhận chỉ mục trong đó các phần tử là đúng trong mặt nạ ở trên
>>> np.any[np.in1d[a1, a2]]
True
5Conclusion:
Dưới đây là bản tóm tắt ngắn gọn về những gì chúng ta đã học được trong bài viết này:
- Sử dụng numpy.isin [] để tìm các phần tử của một mảng thuộc về một mảng khác hay không. Nó trả về một mảng boolean phù hợp với hình dạng của mảng khác, nơi các phần tử sẽ được tìm kiếm
- numpy.isin [] cũng đảo ngược kết quả bằng cách sử dụng tham số đảo ngược và thiết lập nó là đúng
- Đối với mảng thử nghiệm 1D, chúng tôi cũng có thể sử dụng in1d [] để kiểm tra xem các phần tử của mảng 1D thuộc về một mảng khác
- Sử dụng numpy.where [] và numpy.isin [] để lấy chỉ số của tất cả các phần tử phù hợp trong mảng khác
- Ngoài ra, chúng ta cũng có thể sử dụng đầu ra boolean của numpy.isin [] trong numpy.nonzero [] để tìm chỉ số của tất cả các yếu tố phù hợp