Was wir wirklich tun möchten, ist np.in1d
... mit der Ausnahme, dass np.in1d
nur mit 1-dimensionalen Arrays funktioniert. Unsere Arrays sind mehrdimensional. Jedoch können wir Ansicht die Arrays als 1-dimensionales Array von Zeichenketten :
a = a.ravel().view((np.str, a.itemsize*a.shape[1]))
Zum Beispiel
In [15]: a = np.array([[1, 2], [2, 3], [1, 3]])
In [16]: a = a.ravel().view((np.str, a.itemsize*a.shape[1]))
In [17]: a.dtype
Out[17]: dtype('|S8')
In [18]: a.shape
Out[18]: (3,)
In [19]: a
Out[19]:
array(['\x01\x00\x00\x00\x02', '\x02\x00\x00\x00\x03',
'\x01\x00\x00\x00\x03'],
dtype='|S8')
Dies macht jede Reihe von a
eine Zeichenfolge. Nun ist es nur noch eine Frage dies Einhaken zu np.in1d
:
def inNd(a, b, assume_unique=False):
a = np.asarray(a, order='C')
b = np.asarray(b, order='C')
a = a.ravel().view((np.str, a.itemsize * a.shape[1]))
b = b.ravel().view((np.str, b.itemsize * b.shape[1]))
return np.in1d(a, b, assume_unique)
import numpy as np
def inNd(a, b, assume_unique=False):
a = np.asarray(a, order='C')
b = np.asarray(b, order='C')
a = a.ravel().view((np.str, a.itemsize * a.shape[1]))
b = b.ravel().view((np.str, b.itemsize * b.shape[1]))
return np.in1d(a, b, assume_unique)
tests = [
(np.array([[1, 2], [2, 3], [1, 3]]),
np.array([[2, 2], [3, 3], [4, 4]]),
np.array([False, False, False])),
(np.array([[1, 2], [2, 2], [1, 3]]),
np.array([[2, 2], [3, 3], [4, 4]]),
np.array([True, False, False])),
(np.array([[1, 2], [3, 4], [5, 6]]),
np.array([[1, 2], [3, 4], [7, 8]]),
np.array([True, True, False])),
(np.array([[1, 2], [5, 6], [3, 4]]),
np.array([[1, 2], [5, 6], [7, 8]]),
np.array([True, True, False])),
(np.array([[-0.5, 2.5, -2, 100, 2], [5, 6, 7, 8, 9], [3, 4, 5, 6, 7]]),
np.array([[1.0, 2, 3, 4, 5], [5, 6, 7, 8, 9], [-0.5, 2.5, -2, 100, 2]]),
np.array([False, True, True]))
]
for a, b, answer in tests:
result = inNd(b, a)
try:
assert np.all(answer == result)
except AssertionError:
print('''\
a:
{a}
b:
{b}
answer: {answer}
result: {result}'''.format(**locals()))
raise
else:
print('Success!')
Ausbeuten
Success!
Was ist der tatsächliche dtype von 'a' und' b'? – unutbu
@unutbu float (könnte sich auf int setzen) – amine23