我想编写接受可以未标注的数字参数x
的函数,例如x = 1
或大小,列表,元组或ndarray,比如x = np.array([1,2])
。是否有一种编写处理这两种情况的代码的好方法?
作为一个具体的例子,假设目标是将x
广播到一个数组(预定义的形状xshape
)中,如果x
只是一个数字,并在{{{}}时返回错误1}}是一个形状错误的数组。
x
除了嵌套import numpy as np
import sys
if np.shape(np.atleast_1d(x)) == (1,):
x = np.ones(xshape) * x
elif np.shape(x) != xshape:
sys.exit("wrong shape for x")
的困难之外,上述代码似乎也有效。它似乎也违反了一些推荐的做法,例如x = [[2]]
。任何建议表示赞赏。
答案 0 :(得分:0)
执行此操作的一种方法是遵循numpy,它处理所有各种情况并隐藏您的复杂性。例如:
>>> import numpy as np
>>> xshape = (2,)
>>> np.ones(xshape) * 1
array([ 1., 1.])
>>> np.ones(xshape) * [9, 8]
array([ 9., 8.])
>>> np.ones(xshape) * [[9, 8]]
array([[ 9., 8.]])
>>> # Wrong shape
>>> np.ones(xshape) * [[9, 8, 7]]
ValueError Traceback (most recent call last)
<ipython-input-28-dd8a3b87c22c> in <module>()
----> 1 np.ones(xshape) * [[9, 8, 7]]
ValueError: operands could not be broadcast together with shapes (2) (1,3)
另一种相关方法是在函数/脚本的开头使用x = np.aarray(x)
。如果x
已经是一个数组,则没有任何反应,但如果x
是标量或序列,则会创建一个具有相应形状的数组,然后您可以编写其余的代码x
1}}是一个数组(如果x
无法转换为数组,则会引发错误。)