正如标题所说,假设我想写一个符号函数(让我们暂时忘记符号(0)),显然我们期望sign(2)= 1和sign(array([ - 2,-2,2]))=阵列([ - 1,-1,1]).但是,以下函数不起作用,因为它无法处理numpy数组.
def sign(x):
if x>0: return 1
else: return -1
Run Code Online (Sandbox Code Playgroud)
下一个函数将无法工作,因为x只有一个形状成员,如果它只是一个数字.即使使用y = x*0 + 1这样的技巧,y也不会有[]方法.
def sign(x):
y = ones(x.shape)
y[x<0] = -1
return y
Run Code Online (Sandbox Code Playgroud)
即使有另一个问题的想法(如何创建接受numpy数组,可迭代或标量的numpy函数?),当x是单个数字时,下一个函数将不起作用,因为在这种情况下x.shape和y.shape只是()和索引y是非法的.
def sign(x):
x = asarray(x)
y = ones(x.shape)
y[x<0] = -1
return y
Run Code Online (Sandbox Code Playgroud)
唯一的解决方案似乎是首先确定x是数组还是数字,但我想知道是否有更好的东西.如果你有很多像这样的小函数,编写分支代码会很麻烦.
一段时间以来,我一直很好奇.我可以忍受这种情况,但是如果不采取足够的照顾,它总会咬我,所以我决定将它发布在这里.假设以下示例(Numpy版本= 1.8.2):
a = array([[0, 1], [2, 3]])
print shape(a[0:0, :]) # (0, 2)
print shape(a[0:1, :]) # (1, 2)
print shape(a[0:2, :]) # (2, 2)
print shape(a[0:100, :]) # (2, 2)
print shape(a[0]) # (2, )
print shape(a[0, :]) # (2, )
print shape(a[:, 0]) # (2, )
Run Code Online (Sandbox Code Playgroud)
我不知道其他人的感受,但结果与我不一致.最后一行是列向量,而倒数第二行是行向量,它们应该具有不同的维度 - 在线性代数中它们可以做到!(第5行是另一个惊喜,但我暂时忽略它).考虑第二个例子:
solution = scipy.sparse.linalg.dsolve.linsolve.spsolve(A, b) # solution of dimension (n, )
analytic = reshape(f(x, y), (n, 1)) # analytic of dimension (n, 1)
error = solution - analytic
Run Code Online (Sandbox Code Playgroud)
现在错误是维度(n,n).是的,在第二行我应该使用(n,)而不是(n,1),但为什么呢?我以前经常使用MATLAB,其中一维向量具有维度(n,1),linspace/arange返回维度(n,1)的数组,并且从不存在(n,).但是在Numpy(n,1)和(n,)共存时,维度处理有很多功能:至少,newaxis和reshape的不同用途,但对我来说,这些功能更多的是混乱而不是帮助.如果数组打印如[1,2,3],那么直观地说维度应该是[1,3]而不是[3,],对吗?如果Numpy没有(n,),我只能看到清晰度的增益,而不是功能上的损失. …