python: 使用 np.vectorize 和 np.meshgrid 得到数组的 stange 列表 - 误解
python: using np.vectorize and np.meshgrid get a stange list of array - misunderstanding
我在使用 np.vectorize
和 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) 调用函数后得到一个多维数组
切片结果,结合数组
中的第一个元素
(x, y, result)
的 3d 图
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)
切片后得到
水库 =
[[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())
-> np.ndarray 形状为 (3, 4, 2, 2)
为什么不切片?
一个numpy.meshgrid
return a list of 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
函数的结果也需要转换为 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]])
我在使用 np.vectorize
和 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) 调用函数后得到一个多维数组
切片结果,结合数组
中的第一个元素
(x, y, result)
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)
切片后得到
水库 =
[[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())
-> np.ndarray 形状为 (3, 4, 2, 2)
为什么不切片?
一个numpy.meshgrid
return a list of 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
函数的结果也需要转换为 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]])