Verwendung von Basisfunktionalitäten aus Python und Numpy
Sie können den folgenden Einzeiler ausführen, um das Ergebnis zu erhalten ...
import numpy as np
# Your inputs ...
l = [np.array([1, 1, 1]), np.array([2, 2, 2]), np.array([3, 3, 3])]
array_to_remove = np.array([2, 2, 2])
# My result ...
result = [a for a, skip in zip(l, [np.allclose(a, array_to_remove) for a in l]) if not skip]
print(result)
... oder fügen Sie das Folgende in ein Skript ein und experimentieren Sie ein wenig.
Sie benötigen
- numpy.allclose zum Vergleich von Numpy-Arrays bis hin zu Fließkomma-Darstellungsfehlern
- zip
- Listenverstehen
- das Konzept der Maske
Achtung, ...
- diese Lösung liefert eine Liste ohne alle Vorkommen des gesuchten Arrays
- die zurückgegebene Liste enthält Verweise auf die np.ndarray-Instanzen, auf die auch in der ursprünglichen Liste verwiesen wird. Es gibt keine Kopien!
import numpy as np
def remove(array, arrays):
"""
Remove the `array` from the `list` of `arrays`
Returns list with remaining arrays by keeping the order.
:param array: `np.ndarray`
:param arrays: `list:np.ndarray`
:return: `list:np.ndarray`
"""
assert isinstance(arrays, list), f'Expected a list, got {type(arrays)} instead'
assert isinstance(array, np.ndarray), f'Expected a numpy.ndarray, got {type(array)} instead'
for a in arrays:
assert isinstance(a, np.ndarray), f'Expected a numpy.ndarray instances in arrays, found {type(a)} instead'
# We use np.allclose for comparing arrays, this will work even if there are
# floating point representation differences.
# The idea is to create a boolean mask of the same lenght as the input arrays.
# Then we loop over the arrays-elements and the mask-elements and skip the
# flagged elements
mask = [np.allclose(a, array) for a in arrays]
return [a for a, skip in zip(arrays, mask) if not skip]
if __name__ == '__main__':
# Let's start with the following arrays as given in the question
arrays = [np.array([1, 1, 1]), np.array([2, 2, 2]), np.array([3, 3, 3])]
print(arrays)
# And remove this array instance from it.
# Note, this is a new instance, so the object id is
# different. Structure and values coincide.
_arrays = remove(np.array([2, 2, 2]), arrays)
# Let's check the result
print(_arrays)
# Let's check, whether our edge case handling works.
print(arrays)
_arrays = remove(np.array([1, 2, 3]), arrays)
print(_arrays)
0 Stimmen
Nur damit Sie es wissen, es ist keine gute Idee, die
list
als Variable, da es in Python ein Schlüsselwort ist. Das kann Ihnen später zum Verhängnis werden.0 Stimmen
Ja, danke, ich wurde gebissen, während ich herumspielte und versuchte, dieses Problem zu lösen, indem ich die Arrays mit list() in Listen umwandelte und dann remove und so weiter verwendete.