проблема приведения к питону - PullRequest
0 голосов
/ 27 марта 2011

Я пытаюсь интерполировать с помощью следующего кода

    self.indeces = np.arange( tmp_idx[len(tmp_idx) -1] )
    self.samples = np.interp(self.indeces, tmp_idx, tmp_s)

, где tmp_idx и tmp_s - это массивы numpy.Я получаю следующую ошибку:

массив не может быть безопасно приведен к необходимому типу

Знаете ли вы, как это исправить?*

   class myClass
    def myfunction(self, in_array, in_indeces = None):
        if(in_indeces is None):
            self.indeces = np.arange(len(in_array))
        else:
            self.indeces = in_indeces       
        # clean data
        tmp_s = np.array; tmp_idx = np.array;
        for i in range(len(in_indeces)):
            if( math.isnan(in_array[i]) == False and in_array[i] != float('Inf') ):
                tmp_s = np.append(tmp_s, in_array[i])
                tmp_idx = np.append(tmp_idx, in_indeces[i])
        self.indeces = np.arange( tmp_idx[len(tmp_idx) -1] )
        self.samples = np.interp(self.indeces, tmp_idx, tmp_s)

1 Ответ

2 голосов
/ 27 марта 2011

Одна из ваших возможных проблем заключается в том, что, когда у вас есть следующая строка:

tmp_s = np.array; tmp_idx = np.array;

Вы устанавливаете tmp_s и tmp_idx для встроенной функции np.array.Затем, когда вы добавляете, у вас есть массивы типов объектов, с которыми np.interp не знает, что делать.Я думаю, вы, вероятно, думали, что создавали пустые массивы нулевой длины, но это не то, как работает numpy или python.

Вместо этого попробуйте что-то вроде следующего:

class myClass
    def myfunction(self, in_array, in_indeces = None):
        if(in_indeces is None):
            self.indeces = np.arange(len(in_array))
            # NOTE: Use in_array.size or in_array.shape[0], etc instead of len()
        else:
            self.indeces = in_indeces       
        # clean data
        # set ii to the indices of in_array that are neither nan or inf
        ii = ~np.isnan(in_array) & ~np.isinf(in_array)
        # assuming in_indeces and in_array are the same shape
        tmp_s = in_array[ii]
        tmp_idx = in_indeces[ii] 
        self.indeces = np.arange(tmp_idx.size)
        self.samples = np.interp(self.indeces, tmp_idx, tmp_s)

Нет гарантийчто это будет работать отлично, так как я не знаю ваших входов или желаемых выходов, но это должно помочь вам начать.Как примечание, в numpy вам, как правило, не рекомендуется циклически проходить по элементам массива и работать с ними по одному, если есть метод, который выполняет нужную операцию над всем массивом.Использование встроенных методов numpy всегда намного быстрее.Определенно просмотрите numy документы, чтобы увидеть, какие методы доступны.Не следует обращаться с массивами numpy так же, как с обычным списком Python.

...