我可以阻止numpy.array将元素转换为numpy数组吗?

时间:2017-05-01 15:50:26

标签: python python-3.x numpy

我正在尝试将以下内容转换为2x2 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数组或矩阵中吗?

我能够通过首先填充空数组来获得所需的结果,其中jac是间隔列表的列表:

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]

话虽如此,我怀疑这是实现这一目标的更优雅方式。还有更多" pythonic"这样做的方法?

3 个答案:

答案 0 :(得分:1)

似乎numpy会强制执行任何clear syms x k real simp=@(f) simplify(f, 'Steps', 100, 'IgnoreAnalyticConstraints', true); a=matlabFunction(simp((2/50)*(int(x.*sin((k.*pi.*x)/50),x,0,1)+int((2-x).*sin((k.*pi.*x)/50),x,1,2)))); clearvars -except a gif=@(v,k,x,t)sum(a(1:k).*sin(((1:k).*pi.*(x-v.*t)/50)),2); v=1; gif_110=@(x,t)gif(v,110,x,t); figure(1) x=[-20:0.1:20]'; h=plot(x,gif_110(x,0)); grid on;xlabel('space');ylabel('phi(x)'); for t=0:0.1:2 h.YData=gif_110(x,t); drawnow; pause(0.1); end - 就像进入新维度一样,即使使用START OUTPUT ‘screen question1 here’ INPUT ‘user answer’ IF answer1 = ‘yes’ THEN OUTPUT ‘screen question2 here’ INPUT ‘user answer’ ELSE OUTPUT ‘battery question1 here’ INPUT ‘user answer’ IF answer2 = ‘yes’ THEN OUTPUT ‘screen question3 here’ ELSE 调用Sequence也是如此。您可以通过直接使用np.array创建一个空数组然后手动填充它来解决此问题。

dtype=object

答案 1 :(得分: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哪些类不应该解压缩,所以你可能需要先创建空数组。

旁注:numpy数组没有“interval”dtype,如果它是一个无法识别的dtype,它将使用object。使用dtype=interval可能会让其他读者感到困惑,因为他们可能期望有效的dtype。

答案 2 :(得分: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)