2011-11-26 46 views
2

我对python相当陌生,目前我正在使用numPy库以及pyinterval库。我想建立一个不是由浮点数组成的矩阵,而是间隔。构建一个由python替代对象组成的矩阵

但是如果我做到以下几点:

A = [[interval([2,3]), interval([0,1]), interval([1,2]), interval([2,3])]] 
m = np.matrix(A,interval) 

它提供了以下错误:

raise ValueError, "matrix must be 2-dimensional" 

为了看它是怎么做的我看了看这个:

np.array(A) 

并得到以下输出:

array([[[[ 2., 3.]], 
    [[ 0., 1.]], 
    [[ 1., 2.]], 
    [[ 2., 3.]]]]) 

时,我想看到的东西,如:

array([[interval(2,3), interval[0,1], 
     [interval(1,2), interval[2,3]]) 

我不知道如何得到它明白,我现在用的类型,我已经做了一些搜索,但似乎没有任何后尝试过各种东西上班。

我怎样才能得到它作为只有一个元素在数组/矩阵?

谢谢

回答

3

the docs regarding dtype syntax

each type specifier can be prefixed with a repetition number, or a shape. In these cases an array element is created, i.e., an array within a record. That array is still referred to as a single field.

所以将其指定为一个项目在数组中,你可以尝试的D型设置为'(2,)object'

为了使一个2x2 ndarray :

import interval 
A = [(interval.interval([2,3]), interval.interval([0,1])), 
    (interval.interval([1,2]), interval.interval([2,3]))] 
a = np.array(A,dtype='(2,)object') 

制作2x2矩阵:

m=np.matrix(A,dtype='(2,)object') 

警告:我不太了解dtype语法。这太复杂了,偶尔我会看到奇怪的bug报告(#1955,#1760,#1580)与使用异国情调的dtypes有关。我个人的结论是坚持简单朴素的dtypes是更安全的。或者,如果您需要使用更复杂的dtype,则单元测试它以确保其行为与您的预期相符。


更简单的,定义数组更好的办法是:你想

A = [(interval.interval([2,3]), interval.interval([0,1])), 
    (interval.interval([1,2]), interval.interval([2,3]))] 
a = np.empty((2,2),dtype='object') 
a[:]=A 

这告诉numpy的显式什么形状数组,然后,由于D型是object,你可以的东西什么你请进入阵列的单元格。

此外,与上述dtype='(2,)object'解决方案,它也适用于一维数组:

bd = [interval.interval([0,1]), 
     interval.interval([6,7])] 

b = np.empty(2,dtype='object') 
b[:]=bd 
+0

谢谢你,解决它 – user812352

+0

它还是起到了一点奇怪:如果我有以下代码: BD = [间隔([0,1]),间隔([6,7])] b = np.array(BD,D型细胞= '(2)对象') 我得到: 阵列([[(0.0,1.0 ),(0.0,1.0)], [(6.0,7.0),(6.0,7.0)]],dtype = object) 而不是 array([[interval(0.0,1.0)], [ 7.0)]],dtype = obj ect) 你知道这是为什么吗? – user812352

+0

好点。最后,我终于明白,有一种更简单的方法来定义数组而不会与'dtype'混淆。我编辑了这篇文章来展示我的意思。 – unutbu