-1

np.vectorize使用and后我遇到了数组问题np.meshgrid

以下是我的终端的结果

在此处输入图像描述

我是怎么得到的

def test_func(x, y):
    """
    some calc here:
    arr = np.linspace(1,100, num=y)
    res = another_func(x, arr) 
    return np.sum(res, axis=-1)

    """

    return # (2,2)-np.ndarray

X = np.array([1, 2, 3, 4])
Y = np.array([1, 2, 3])

X, Y = np.meshgrid(X, Y)

# res = test_func(X, Y) ---> TypeError: only size-1 arrays can be converted to Python scalars

func = np.vectorize(test_func, otypes=[object])

res = func(X, Y)

会发生什么

用 (x, y) 调用函数后得到一个 (2, 2)-array
在用一系列 (x, y) 调用函数后得到一个多维-array
切片结果,结合 Array
3d-plot 中的第一个元素(x, y, 结果)

res = \
[[array([[1, 2],
         [3, 4]]),
  array([[11, 12],
         [13, 14]]),
  array([[111, 122],
         [133, 144]]),
  array([[1111, 1222],
         [1333, 1444]])],
 [array([[1, 2],
         [3, 4]]),
  array([[11, 12],
         [13, 14]]),
  array([[111, 122],
         [133, 144]]),
  array([[1111, 1222],
         [1333, 1444]])],
 [array([[1, 2],
         [3, 4]]),
  array([[11, 12],
         [13, 14]]),
  array([[111, 122],
         [133, 144]]),
  array([[1111, 1222],
         [1333, 1444]])]]

    type <class 'numpy.ndarray'>
    shape (3, 4)

切片后得到
res =
[[1 11 11 1111],
[1 11 11 1111],
[1 11 11 1111]]

然后plot_3d(X,Y,res)

问题

为什么类型res是数组?它看起来像一个数组列表。

我试过用 np.array(res) ->什么都不改变,和图一样,shape(3, 4)

np.array(res.tolst())-> 形状为 (3, 4, 2, 2) 的 np.ndarray

4

1 回答 1

0

为什么不切片?

Anumpy.meshgrid返回一个列表numpy.ndarray

例子

假设您想从以下x和创建一个网格网格y

x = np.random.randint(10, size=(5))
y = np.random.randint(10, size=(5))
meshgrid = np.meshgrid(x,y)

你会得到类似的东西:

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

但那是一个列表,并且列表没有属性 shape ( AttributeError: 'list' object has no attribute 'shape')。

那么这个怎么切呢?

如果您需要将列表切片为 numpy 矩阵,请将其转换为 numpy 数组:

numpy_meshgrid = np.array(meshgrid)

您的函数的结果很可能func也需要转换为numpy.ndarray.

现在你可以切片所有你想要的:

array= np.random.randint(10, size=(3, 4, 2, 2))
slice = array[:,:,0,0]

结果是:

array([[6, 7, 5, 3],
   [1, 6, 0, 5],
   [4, 5, 6, 9]])
于 2018-07-13T14:13:50.683 回答