Почему python возвращает True для этого оператора с массивами numpy? [Дубликат]

Если все остальное не удается, перекомпилируйте.

Недавно я смог избавиться от нерешенной внешней ошибки в Visual Studio 2012, просто перекомпилировав нарушивший файл. Когда я перестроил, ошибка исчезла.

Это обычно происходит, когда две (или более) библиотеки имеют циклическую зависимость. Библиотека A пытается использовать символы в B.lib и библиотеке B пытается использовать символы из A.lib. Ничего не существует для начала. Когда вы пытаетесь скомпилировать A, шаг ссылки завершится неудачно, потому что он не может найти B.lib. A.lib будет сгенерирован, но не будет dll. Затем вы компилируете B, который будет успешным и сгенерирует B.lib. Повторная компиляция A теперь будет работать, потому что теперь найден B.lib.

16
задан user2357112 19 August 2013 в 19:50
поделиться

2 ответа

Я нашел источник для ndarray.__contains__, в numpy/core/src/multiarray/sequence.c . В качестве комментария в исходных состояниях

thing in x

эквивалентно

(x == thing).any()

для ndarray x, независимо от размеров x и thing , Это имеет смысл только тогда, когда thing является скаляром; результаты вещания, когда thing не являются скалярными, вызывают странные результаты, которые я наблюдал, а также такие странности, как array([1, 2, 3]) in array(1), которые я не думал попробовать. Точный источник -

static int
array_contains(PyArrayObject *self, PyObject *el)
{
    /* equivalent to (self == el).any() */

    PyObject *res;
    int ret;

    res = PyArray_EnsureAnyArray(PyObject_RichCompare((PyObject *)self,
                                                      el, Py_EQ));
    if (res == NULL) {
        return -1;
    }
    ret = array_any_nonzero((PyArrayObject *)res);
    Py_DECREF(res);
    return ret;
}
7
ответ дан user2357112 24 August 2018 в 04:44
поделиться

Кажется, что numpy __contains__ делает что-то подобное для 2-го случая:

def __contains__(self, item):
    for row in self:
        if any(item_value == row_value for item_value, row_value in zip(item, row)):
            return True
    return False

[1,7] работает, потому что 0 -й элемент первой строки соответствует 0 -му элементу [1,7]. То же самое с [1,2] и т. Д. С помощью [2,6] 6 соответствует 6 в последней строке. С помощью [2,3] ни один из элементов не соответствует строке в том же индексе. [1, 2, 3] тривиально, так как формы не совпадают.

Подробнее см. this , а также этот билет .

5
ответ дан Alok Singhal 24 August 2018 в 04:44
поделиться
Другие вопросы по тегам:

Похожие вопросы: