2012-05-25 16 views
7

Me gustaría comprobar si dos ndarrays son vistas superpuestas del mismo ndarray subyacente.¿cómo puedo comprobar que dos sectores de matrices numpy son iguales (o se superponen)?

para comprobar que dos rebanadas son exactamente lo mismo, puedo hacer algo como:

a.base is b.base and a.shape == b.shape and a.data == b.data 

La comparación de las memorias intermedias parecía funcionar en un caso sencillo - puede alguien decirme si funciona en general?

Desafortunadamente, esto no funcionará para la superposición de sectores, y no he descubierto cómo extraer del almacenamiento intermedio exactamente cuál es su desplazamiento en los datos subyacentes. Tal vez alguien me puede ayudar con esto.

Además, dicen a y b son rebanadas de x y c es una rebanada de b. Como los datos subyacentes son los mismos, también me gustaría detectar superposiciones entre c y a. Parecería que debería ser capaz de salirme con la comparación de solo amortiguación y forma ... si alguien pudiera decirme exactamente cómo, estaría agradecido.

Respuesta

9

numpy.may_share_memory() es la mejor heurística que tenemos en este momento. Es conservativamente heurístico; puede darte falsos positivos, pero no te dará falsos negativos. Creo que podría haber formas de mejorar la heurística para que sea 100% correcta. Si funcionan, se plegarán en esa función, así que esa es la mejor manera de avanzar.

+0

¿Qué tipo de casos puedo esperar para fallar? Si se trata de segmentos escalonados con pasos no unidos que generan falsos positivos, puedo vivir con eso ... – shaunc

+2

'x [0 :: 2]'/'x [1 :: 2]'. 'x [:, 0: 5]', 'x [:, 5:10]'. 'x = np.dstack (* args); np.may_share_memory (x [0], x [1]) '. –

1

Es posible comparar dónde viven los índices en la memoria utilizando la propiedad ctypes de las matrices. Puede tomar algún trabajo, por lo que es posible que desee dar un paso atrás y ver si hay una forma diferente de resolver su problema.

Cuestiones relacionadas