2017-05-01 67 views
1

我使用嘗試轉換下,以間隔對象的一個​​2x2的陣列numpy的:我可以阻止numpy.array將元素轉換爲numpy數組嗎?

from interval import interval # from the "pyinterval" package 
import numpy as np 

np.array([ 
    [interval([1.0, 2.0]), interval([1.0, 2.0])], 
    [interval([1.0, 2.0]), interval([1.0, 2.0])] 
    ]) 

不幸的是,這種操作蒙上間隔爲numpy的陣列,並給了我一個2x2x1x2矩陣。有什麼辦法可以防止這種情況發生在numpy數組或矩陣上嗎?

我能夠通過第一填充空數組,以獲得期望的結果,其中,江淮汽車是間隔的名單列表:

arr = np.empty(shape=(2,2), dtype=interval) 

for i in range(len(arr)): 
    for j in range(len(arr)): 
     arr[i][j] = jac[i][j] 

話雖這麼說,我懷疑有一個更優雅的方式來實現這一目標。有沒有更「Python」的方式來做到這一點?

+1

什麼是間隔?你不能像一個函數那樣調用一個模塊。 – wim

+0

嗨!對不起,我正在使用pyinterval;我已經糾正了問題。謝謝! – yuanagain

+0

區間對象顯然看起來像列表。 – hpaulj

回答

0

看起來像numpy會強制任何東西Sequence類似於一個新的維度,即使np.array調用dtype=object。您可以通過使用dtype=object直接製作一個空陣列並手動填充來解決此問題。

interval_list = get_intervals() 
interval_array = np.ndarray(len(interval_list), dtype=object) 

for i, interv in enumerate(interval_list): 
    interval_array[i] = interv 
0

填充空數組時,你並不需要顯式循環,你可以用[:]分配:

class interval(list): 
    """I don't have any real interval but this should work.""" 
    def __repr__(self): 
     return 'interval({})'.format(super().__repr__()) 

import numpy as np 

>>> a = np.empty((2, 2), dtype=object) 

>>> a[:] = [[interval([1.0, 2.0]), interval([1.0, 2.0])], 
...   [interval([1.0, 2.0]), interval([1.0, 2.0])]] 

>>> a 
array([[interval([1.0, 2.0]), interval([1.0, 2.0])], 
     [interval([1.0, 2.0]), interval([1.0, 2.0])]], dtype=object) 
>>> a.shape 
(2, 2) 
>>> a[0, 0] 
interval([1.0, 2.0]) 

不幸的是沒有辦法明確地告訴numpy.array哪些類不應該解壓縮,所以你可能需要首先創建空數組。


在一個側面說明:沒有「間隔」 D型爲numpy的數組,如果它是它將使用object無法識別的D型。使用dtype=interval可能會讓其他讀者感到困惑,因爲他們可能會期望有效的dtype。

0

使用分配和填充方法通常可以從列表中分配多個項目。我有一個模糊的記憶,有時不起作用,但它確實爲列表工作:

In [84]: jac = [[[1,2],[1,2]],[[1,2],[1,2]]] 
In [85]: arr = np.empty((2,2),dtype=object) 
In [86]: arr[...] = jac 
In [87]: arr 
Out[87]: 
array([[[1, 2], [1, 2]], 
     [[1, 2], [1, 2]]], dtype=object) 
In [88]: arr[1,0] 
Out[88]: [1, 2] 

p.s.它也適用於jac = [[[[1,2]],[[1,2]]],[[[1,2]],[[1,2]]]],這將產生一個(2,2,1,2)用作np.array(jac)

+0

「我有一個模糊的記憶,有時不起作用」,只有在涉及隱式廣播或解包的情況下。當形狀相同時,我從未遇到過問題。 – MSeifert

相關問題