我的理解是,numpy 中的一维数组可以解释为面向列的向量或面向行的向量。例如,形状为 (8,) 的一维数组可以被视为形状为 (1,8) 或形状为 ( 8,1) 取决于上下文。
我遇到的问题是,我编写的用于操作数组的函数往往在二维情况下可以很好地泛化以处理向量和矩阵,但在一维情况下则不太好。
因此,我的函数最终会执行如下操作:
if arr.ndim == 1:
# Do it this way
else:
# Do it that way
甚至这样:
# Reshape the 1-D array to a 2-D array
if arr.ndim == 1:
arr = arr.reshape((1, arr.shape[0]))
# ... Do it the 2-D way ...
也就是说,我发现我可以概括代码来处理二维情况 (r,1), (1,c), (r, c),但不是没有分支或 reshape 的一维情况。
当函数在多个数组上运行时,它会变得更加丑陋,因为我会检查并转换每个参数。
所以我的问题是:我是否遗漏了一些更好的成语?我上面描述的模式对 numpy 代码是通用的吗?
此外,作为 API 设计原则的相关问题,如果调用者将一个一维数组传递给某个返回新数组的函数,并且返回值也是一个向量,那么 reshape 一个二维数组是否是常见的做法? D 向量 (r,1) 或 (1,c) 返回一维数组,还是简单地记录函数返回二维数组?
谢谢
最佳答案
我认为一般来说,需要形状为 (r,c) 的数组的 NumPy 函数不会特别考虑一维数组。相反,他们希望用户传递一个形状为 (r,c) 的数组,或者让用户传递一个一维数组 broadcasts直到形状 (r,c)。
如果您将形状为 (c,) 的一维数组传递给这样的函数,它将广播到形状 (1,c),因为广播添加了新轴在左边。它还可以为任意 r 广播形状 (r,c)(取决于与它组合的其他数组)。
另一方面,如果您有一个形状为 (r,) 的一维数组 x 并且您需要它广播形状为 (r,c),那么 NumPy 希望用户传递形状为 (r,1) 的数组,因为广播不会为您在右侧添加新轴。
为此,用户必须传递 x[:,np.newaxis] 而不仅仅是 x。
关于返回值:我认为最好总是返回一个二维数组。如果用户知道输出的形状为 (1,c),并且想要一个一维数组,让她切掉一维数组 x[0] 她自己。
通过使返回值始终具有相同的形状,将更容易理解使用此函数的代码,因为输入的形状并不总是很明显。
此外,广播模糊了形状为 (c,) 的一维数组和形状为 (r,c) 的二维数组之间的区别。如果您的函数在提供一维输入时返回一维数组,在提供二维输入时返回二维数组,那么您的函数会严格区分而不是模糊。从风格上讲,这让我想起了检查 if isinstance(obj,type),这与 duck-typing 的本质背道而驰。如果没有必要,请不要这样做。
关于python - 编写接受一维和二维 numpy 数组的函数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8287047/
关闭。这个问题是opinion-based.它目前不接受答案。想要改进这个问题?更新问题,以便editingthispost可以用事实和引用来回答它.关闭4年前。Improvethisquestion我想在固定时间创建一系列低音和高音调的哔哔声。例如:在150毫秒时发出高音调的蜂鸣声在151毫秒时发出低音调的蜂鸣声200毫秒时发出低音调的蜂鸣声250毫秒的高音调蜂鸣声有没有办法在Ruby或Python中做到这一点?我真的不在乎输出编码是什么(.wav、.mp3、.ogg等等),但我确实想创建一个输出文件。
我有多个ActiveRecord子类Item的实例数组,我需要根据最早的事件循环打印。在这种情况下,我需要打印付款和维护日期,如下所示:ItemAmaintenancerequiredin5daysItemBpaymentrequiredin6daysItemApaymentrequiredin7daysItemBmaintenancerequiredin8days我目前有两个查询,用于查找maintenance和payment项目(非排他性查询),并输出如下内容:paymentrequiredin...maintenancerequiredin...有什么方法可以改善上述(丑陋的)代
我的代码目前看起来像这样numbers=[1,2,3,4,5]defpop_threepop=[]3.times{pop有没有办法在一行中完成pop_three方法中的内容?我基本上想做类似numbers.slice(0,3)的事情,但要删除切片中的数组项。嗯...嗯,我想我刚刚意识到我可以试试slice! 最佳答案 是numbers.pop(3)或者numbers.shift(3)如果你想要另一边。 关于ruby-多次弹出/移动ruby数组,我们在StackOverflow上找到一
我需要读入一个包含数字列表的文件。此代码读取文件并将其放入二维数组中。现在我需要获取数组中所有数字的平均值,但我需要将数组的内容更改为int。有什么想法可以将to_i方法放在哪里吗?ClassTerraindefinitializefile_name@input=IO.readlines(file_name)#readinfile@size=@input[0].to_i@land=[@size]x=1whilex 最佳答案 只需将数组映射为整数:@land边注如果你想得到一条线的平均值,你可以这样做:values=@input[x]
我想用ruby编写一个小的命令行实用程序并将其作为gem分发。我知道安装后,Guard、Sass和Thor等某些gem可以从命令行自行运行。为了让gem像二进制文件一样可用,我需要在我的gemspec中指定什么。 最佳答案 Gem::Specification.newdo|s|...s.executable='name_of_executable'...endhttp://docs.rubygems.org/read/chapter/20 关于ruby-在Ruby中编写命令行实用程序
我正在使用puppet为ruby程序提供一组常量。我需要提供一组主机名,我的程序将对其进行迭代。在我之前使用的bash脚本中,我只是将它作为一个puppet变量hosts=>"host1,host2"我将其提供给bash脚本作为HOSTS=显然这对ruby不太适用——我需要它的格式hosts=["host1","host2"]自从phosts和putsmy_array.inspect提供输出["host1","host2"]我希望使用其中之一。不幸的是,我终其一生都无法弄清楚如何让它发挥作用。我尝试了以下各项:我发现某处他们指出我需要在函数调用前放置“function_”……这
这个问题在这里已经有了答案:Checktoseeifanarrayisalreadysorted?(8个答案)关闭9年前。我只是想知道是否有办法检查数组是否在增加?这是我的解决方案,但我正在寻找更漂亮的方法:n=-1@arr.flatten.each{|e|returnfalseife
我想在一个没有Sass引擎的类中使用Sass颜色函数。我已经在项目中使用了sassgem,所以我认为搭载会像以下一样简单:classRectangleincludeSass::Script::FunctionsdefcolorSass::Script::Color.new([0x82,0x39,0x06])enddefrender#hamlengineexecutedwithcontextofself#sothatwithintemlateicouldcall#%stop{offset:'0%',stop:{color:lighten(color)}}endend更新:参见上面的#re
我有一个这样的哈希数组:[{:foo=>2,:date=>Sat,01Sep2014},{:foo2=>2,:date=>Sat,02Sep2014},{:foo3=>3,:date=>Sat,01Sep2014},{:foo4=>4,:date=>Sat,03Sep2014},{:foo5=>5,:date=>Sat,02Sep2014}]如果:date相同,我想合并哈希值。我对上面数组的期望是:[{:foo=>2,:foo3=>3,:date=>Sat,01Sep2014},{:foo2=>2,:foo5=>5:date=>Sat,02Sep2014},{:foo4=>4,:dat
我正在尝试在Ruby中制作一个cli应用程序,它接受一个给定的数组,然后将其显示为一个列表,我可以使用箭头键浏览它。我觉得我已经在Ruby中看到一个库已经这样做了,但我记不起它的名字了。我正在尝试对soundcloud2000中的代码进行逆向工程做类似的事情,但他的代码与SoundcloudAPI的使用紧密耦合。我知道cursesgem,我正在考虑更抽象的东西。广告有没有人见过可以做到这一点的库或一些概念证明的Ruby代码可以做到这一点? 最佳答案 我不知道这是否是您正在寻找的,但也许您可以使用我的想法。由于我没有关于您要完成的工作