У меня есть некоторые функции в Python, возвращающие numpy.array:
matrix = np.array([0.,0.,0.,0.,0.,0.,1.,1.,1.,0.],
[0.,0.,0.,1.,1.,0.,0.,1.,0.,0.])
def some_function:
rows1, cols1 = numpy.nonzero(matrix)
cols2 = numpy.array([6,7,8,3,4,7])
rows2 = numpy.array([0,0,0,1,1,1])
print numpy.array_equal(rows1, rows2) # returns True
print numpy.array_equal(cols1, cols2) # returns True
return (rows1, cols1) # or (rows2, cols2)
Обычно он должен извлекать индексы ненулевых элементов матрицы (row1, cols1). Тем не менее, я также могу извлечь индексы вручную (row2, cols2). Проблема в том, что программа возвращает разные результаты в зависимости от того, возвращает ли функция (rows1, cols1)
или же (rows2, cols2)
хотя массивы должны быть равны.
Я должен, вероятно, добавить, что этот код используется в контексте pyipopt, который вызывает программный пакет C ++ IPOPT. Проблема возникает в этом пакете.
Может ли быть так, что массивы не «полностью» равны? Я бы сказал, что они так или иначе должны быть, потому что я ничего не изменяю, а возвращаю одно вместо другого.
Любая идея о том, как отладить эту проблему?
Вы можете проверить где массивы не равны:
print(where(rows1 != rows2))
Но то, что вы делаете, неясно, во-первых, нет nonzeros
функция в NumPy, только отлична от нуля который возвращает кортеж координат. Вы используете только тот, который соответствует строкам?