代码之家  ›  专栏  ›  技术社区  ›  sun0727

python:使用np.vectorize和np.meshgrid获得数组的节列表-误解

  •  -1
  • sun0727  · 技术社区  · 6 年前

    使用后数组有问题 np.vectorize np.meshgrid

    下面是我的终端的结果

    enter image description here

    我怎么得到的

    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)-数组
    在用序列(x,y)调用函数之后,获取多维数组
    结合数组中的第一个元素对结果进行切片
    三维绘图(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)
    

    切片后得到
    资源=
    [[11 11 1111],
    [1111111],
    [1111111]]

    然后 plot_3d(X,Y,res)

    问题

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

    我试着用 np.array(res) ->不更改任何内容,与图形、形状(3、4)相同

    np.array(res.tolst()) ->np.ndarray带形状(3、4、2、2)

    1 回复  |  直到 6 年前
        1
  •  0
  •   Luca Cappelletti    6 年前

    为什么不切?

    一个 numpy.meshgrid 返回A 列表 属于 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]])]
    

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

    那怎么切呢?

    如果需要将列表分割为numpy矩阵,请将其转换为numpy数组:

    numpy_meshgrid = np.array(meshgrid)
    

    很可能是你 func 函数还需要转换为 新德里 是的。

    现在你可以随心所欲地切割了:

    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]])