2016-07-15 103 views
0

我想的astropyAngles對象實例添加到NumPy數組,我得到一個錯誤:用對象實例填充NumPy數組?

ValueError: setting an array element with a sequence.

Angle對象是這個樣子:

<Angle 1.2557346257567 deg>

如果我把它們放在一個正常的Python列表中,然後我得到:

s = [<Angle 1.2562500714928306 deg>, 
    <Angle 1.2562500714928306 deg>, 
    <Angle 1.2562500714928306 deg>] 
len(s) 
>>> 3 
len(s[0]) 
>>> TypeError: 'Angle' object with a scalar value has no len() 

所以,我的第一個問題是,在什麼方式是一個Python對象的序列?而且,由於numpy數組需要初始化爲特定的維度,我如何找到這個對象的「長度」,以便我可以將它們加載到一個numpy數組中?

+0

你可以添加一些'Angle'文檔嗎?有很多'numpy'用戶對'astropy'完全不瞭解。 – hpaulj

+0

@hpaulj這在很大程度上是無關緊要的,這是一個通用的問題,當試圖將任何對象放入一個預先分配的numpy數組中充滿零時會發生。我剛剛在我的'numpy.zeros()'調用中添加了'dtype = object',並且一切正常 – Anonymous

回答

2

我沒有astrop包,不知道Angle對象的詳細信息。但我可以做一些Python和numpy的觀察。

<Angle 1.2557346257567 deg>是此對象的字符串表示形式,由其__repr__方法生成。

TypeError for len(s[0])表示該對象不是__len__方法。它不是列表的子類,也不是專用的numpy數組。檢查其文檔。它可能有一種產生一個或多個數值的方法。

你不說你如何試圖'添加'一個角度數組,或什麼樣的數組。如果數組是數字的,例如dtype=float,然後做

A[0]= <Angle...> 

是行不通的,因爲Angle是不是一個數字,也不會產生一個 - 至少在沒有一些方法。你需要告訴我們這個目標數組應該包含什麼。數字,角度對象?

您可以構建一個包含對象的數組。 np.array(s)可能工作。它在列表包含字典對象時執行。

In [67]: ll 
Out[67]: [{1: 2}, {}, {'a': 1, 'b': 2}] 

In [68]: np.array(ll) 
Out[68]: array([{1: 2}, {}, {'b': 2, 'a': 1}], dtype=object) 

np.array([...])可能會非常棘手使用,因爲它的設計製造數字的多維數組 - 如果可能的話。

或者您可能需要製作A = np.zeros((3,),dtype=object)數組,並分別賦值,A[0]=s[0]。但是這樣的對象數組只是列表中的變體。這不是一個二維數組數組。

從以前astropy問題:

How to covert np.ndarray into astropy.coordinates.Angle class?

Angle(angles_quantity).wrap_at('360d').value # This returns a simple ndarray again. 

=================

挖掘到的文檔和astropy github上代碼,我看到AngleQuantity的一個子類,它是ndarray的子類。它試圖實際上是一個具有適當的unit定義的數組(或標量)。

.value方法返回self.view(np.ndarray),除非它的形狀爲0d,在這種情況下,它將返回標量值self.item()

因此,您應該能夠定義具有多個值的Angle,例如,

Angle([1.23, 1.24, 1.25]) 

我不知道你是否可以加入多個Angles到一個

Angle(s) 

其中s是你的角度對象名單,可能會奏效。我看不到版本的concatenatestack

+0

謝謝,我所要做的就是在我的'numpy.zeros()'調用中添加'dtype = object',它正在工作。我也知道了''上對象Angle'屬性.value',但我想保留'unit'信息,並保持他們在對象的形式也使一些很好'astropy'功能。 – Anonymous

+0

我發現'Angle'是'ndarray'的一個子類。有關更多信息,請參閱我的編輯。 – hpaulj

0

您可以在陣列的dtype設置爲object,一個簡單的例子是

import numpy as np 
from astropy.coordinates import Angle 
a, b, c = Angle('1.2562500714928306d'), Angle('1.2562500714928306d'), Angle('1.2562500714928306d') 
s = np.array([a, b, c], dtype=object) 
4

不要創建Angle對象的列表或數組。
取而代之的是,查看Angle(以及類似的太空類)作爲容器對象,它添加一個單元,並用列表或數組對其進行初始化。

例如:

>>> from astropy.coordinates import Angle 
>>> from astropy import units 
>>> angles = Angle([0, 30, 60, 90], unit=units.degree) 
>>> angles 
<Angle [ 0., 30., 60., 90.] deg> 

>>> angles = Angle(np.linspace(0, 90, 15, endpoint=True), unit=units.degree) 
>>> angles 
<Angle [ 0.  , 6.42857143, 12.85714286, 19.28571429, 25.71428571, 
     32.14285714, 38.57142857, 45.  , 51.42857143, 57.85714286, 
     64.28571429, 70.71428571, 77.14285714, 83.57142857, 90.  ] deg> 
>>> len(angles) 
15 

這是astropy類工作的一個更有效的方式:你現在可以簡單地乘以angles一個值,或執行其他操作它就像一個numpy數組。