Нахождение TypeError вычитая два numpy.ndarrays одинакового размера и типа - PullRequest
0 голосов
/ 30 ноября 2011

Я пытаюсь найти относительное положение моего датчика по отношению к солнцу, вычитая солнечный азимут из курса компаса.Для целей тестирования у меня есть два числа NumPy.Один с солнечным азимутом для 52 различных выборок и один с компасом для 52 различных выборок.

Я все время делаю этот вид операнда на числах с нулевыми числами, поэтому я не знаю, почему он дает мнеследующая ошибка.

    TypeError: unsupported operand type(s) for -: 'numpy.ndarray' and 'numpy.ndarray'

Это часть кода, я постараюсь включить как можно больше, но он исходит из большой базы кода.

    ####STUFF above####

    # for debugging
    a = dalecData.get_solar_azimuth()
    b = dalecData.get_cmp_heading()

    print type(a)
    print type(b)

    print a.shape
    print b.shape

    print a.flags
    print b.flags

    print a.ndim
    print b.ndim

    a - b

    #work aroundS ????

    #sensorAzimuth = subract(dalecData.get_solar_azimuth(),dalecData.get_cmp_heading()) 
    #sensorAzimuth = asarray(dalecData.get_solar_azimuth()) -  asarray(dalecData.get_cmp_heading())## wtf?
    #for i in range(0,dalecData.get_solar_azimuth().shape[0]):
    #    sensorAzimuth[i] = dalecData.get_solar_azimuth()[i] - dalecData.get_cmp_heading()[i]

Дает мне следующееoutput

    <type 'numpy.ndarray'>
    <type 'numpy.ndarray'>
    (52, 1)
    (52, 1)
    C_CONTIGUOUS : True
    F_CONTIGUOUS : False
    OWNDATA : True
    WRITEABLE : True
    ALIGNED : True
    UPDATEIFCOPY : False
    C_CONTIGUOUS : True
    F_CONTIGUOUS : False
    OWNDATA : True
    WRITEABLE : True
    ALIGNED : True
    UPDATEIFCOPY : False
    2
    2

Все «обходные пути» дают одинаковую ошибку

Векторы инициализируются с использованием

    # viewing geometry
    self.__solarZenith = zeros((1))
    self.__solarAzimuth = zeros((1))

Accessors

    def get_solar_zenith(self):
        return self.__solarZenith


    def get_solar_azimuth(self):
        return self.__solarAzimuth

    def set_cmp_heading(self,value):
        self.__cmpHeading = value

И заполняется с помощью

    row = self.findClosestDatetime(self.__edStartTime[i], self.__cmpDateTime)
    heading = vstack((heading, self.__cmpHeading[row-1]))
    heading = delete(heading,0,0) # get rid of initialised 0
    self.set_cmp_heading(heading)

. Это должно привести к повторной выборке данных во времена выборки edStartTime.И, кажется, работает.

солнечный зенит и азимут вычисляются с использованием pysolar http://pysolar.org/

Все значения кажутся правильными, я просто не могу вычесть значения из каждогоДругой.Это происходит только с этими векторами.Я могу добавить и вычесть другие векторы таким же образом в другом месте моего кода.

Я надеюсь, что объяснил свою ситуацию.Буду признателен за помощь в понимании ошибки.

Спасибо

1 Ответ

0 голосов
/ 03 мая 2015

похоже, что ваш массив является структурированным массивом . Вы можете проверить это с помощью a.dtype и b.dtype, если выходные данные выглядят как dtype('float64'), то я ошибаюсь, но если он выглядит как [('f0', '<f8')] тогда элементы вашего массива (ов) являются записями с плавающей точкой, а не с плавающей точкой, и numpy не знает, как с ними работать.

Это например:

>>> x = np.array([1,2,3])
>>> x.dtype
dtype('int64')
>>> np.diff(x)
array([1, 1])
>>> x.dtype = np.dtype([('f0', '<i8')])
>>> np.diff(x)
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "/usr/lib/python2.7/dist-packages/numpy/lib/function_base.py", line 998, in diff
return a[slice1]-a[slice2]
TypeError: unsupported operand type(s) for -: 'numpy.ndarray' and 'numpy.ndarray'
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...