当然,0d 数组是标量,但 Numpy 似乎不这么认为......我错过了什么还是我只是误解了这个概念?
>>> foo = numpy.array(1.11111111111, numpy.float64)
>>> numpy.ndim(foo)
0
>>> numpy.isscalar(foo)
False
>>> foo.item()
1.11111111111
最佳答案
人们不应该想太多。这最终对个人的心理健康和长寿有好处。
Numpy 标量类型的奇怪情况是因为没有优雅且一致的方法将 1x1 矩阵降级为标量类型。尽管在数学上它们是相同的东西,但它们由非常不同的代码处理。
如果您一直在编写任何数量的科学代码,最终您会希望像 max(a) 这样的东西可以处理各种大小的矩阵,甚至是标量。从数学上讲,这是一件完全合情合理的事情。然而,对于程序员来说,这意味着在 Numpy 中呈现的任何标量都应该具有 .shape 和 .ndim 属性,因此至少 ufunc 不必针对 Numpy 中的 21 种可能的标量类型对其输入进行显式类型检查。
另一方面,它们还应该与现有的 Python 库一起工作,这些库确实对标量类型进行显式类型检查。这是一个难题,因为 Numpy ndarray 必须在它们被简化为标量时单独更改其类型,并且如果没有对所有访问进行检查,就无法知道是否发生了这种情况。实际上,按照标量类型标准,走这条路可能会有点慢得离谱。
Numpy 开发者的解决方案是从 ndarray 和 Python 标量继承它自己的标量类型,这样所有标量也有 .shape、.ndim、.T 等。1x1 矩阵仍然存在,但它的如果您知道您将处理标量,则不鼓励使用。虽然这在理论上应该可以正常工作,但偶尔你仍然可以看到一些他们被油漆滚筒遗漏的地方,并且丑陋的内脏暴露在外,让所有人都能看到:
>>> from numpy import *
>>> a = array(1)
>>> b = int_(1)
>>> a.ndim
0
>>> b.ndim
0
>>> a[...]
array(1)
>>> a[()]
1
>>> b[...]
array(1)
>>> b[()]
1
a[...] 和 a[()] 确实没有理由返回不同的东西,但确实如此。有一些建议可以改变这一点,但看起来他们忘了完成 1x1 阵列的工作。
一个可能更大且可能无法解决的问题是 Numpy 标量是不可变的。因此,将一个标量“喷射”到一个 ndarray 中,数学上是将一个数组折叠成一个标量的伴随操作,是一个要实现的 PITA。你实际上不能增长一个 Numpy 标量,它不能被定义为一个 ndarray,即使 newaxis 神秘地在它上面工作:
>>> b[0,1,2,3] = 1
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
TypeError: 'numpy.int32' object does not support item assignment
>>> b[newaxis]
array([1])
在 Matlab 中,增加标量的大小是完全可以接受且无需脑力的操作。在 Numpy 中,您必须在 认为 可能以标量开始并以数组结束的任何地方都坚持使用 jarring a = array(a)。我理解为什么 Numpy 必须以这种方式与 Python 配合得很好,但这并不能改变许多新切换器对此深感困惑的事实。有些人清楚地记得与这种行为作斗争并最终坚持下去,而另一些离得太远的人通常会留下一些深深的无形的精神伤疤,经常困扰着他们最天真的梦想。这对所有人来说都是一个丑陋的情况。
关于python - 为什么 Numpy 中的 0d 数组不被视为标量?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/773030/
总的来说,我对ruby还比较陌生,我正在为我正在创建的对象编写一些rspec测试用例。许多测试用例都非常基础,我只是想确保正确填充和返回值。我想知道是否有办法使用循环结构来执行此操作。不必为我要测试的每个方法都设置一个assertEquals。例如:describeitem,"TestingtheItem"doit"willhaveanullvaluetostart"doitem=Item.new#HereIcoulddotheitem.name.shouldbe_nil#thenIcoulddoitem.category.shouldbe_nilendend但我想要一些方法来使用
类classAprivatedeffooputs:fooendpublicdefbarputs:barendprivatedefzimputs:zimendprotecteddefdibputs:dibendendA的实例a=A.new测试a.foorescueputs:faila.barrescueputs:faila.zimrescueputs:faila.dibrescueputs:faila.gazrescueputs:fail测试输出failbarfailfailfail.发送测试[:foo,:bar,:zim,:dib,:gaz].each{|m|a.send(m)resc
我试图在一个项目中使用rake,如果我把所有东西都放到Rakefile中,它会很大并且很难读取/找到东西,所以我试着将每个命名空间放在lib/rake中它自己的文件中,我添加了这个到我的rake文件的顶部:Dir['#{File.dirname(__FILE__)}/lib/rake/*.rake'].map{|f|requiref}它加载文件没问题,但没有任务。我现在只有一个.rake文件作为测试,名为“servers.rake”,它看起来像这样:namespace:serverdotask:testdoputs"test"endend所以当我运行rakeserver:testid时
作为我的Rails应用程序的一部分,我编写了一个小导入程序,它从我们的LDAP系统中吸取数据并将其塞入一个用户表中。不幸的是,与LDAP相关的代码在遍历我们的32K用户时泄漏了大量内存,我一直无法弄清楚如何解决这个问题。这个问题似乎在某种程度上与LDAP库有关,因为当我删除对LDAP内容的调用时,内存使用情况会很好地稳定下来。此外,不断增加的对象是Net::BER::BerIdentifiedString和Net::BER::BerIdentifiedArray,它们都是LDAP库的一部分。当我运行导入时,内存使用量最终达到超过1GB的峰值。如果问题存在,我需要找到一些方法来更正我的代
关闭。这个问题是opinion-based.它目前不接受答案。想要改进这个问题?更新问题,以便editingthispost可以用事实和引用来回答它.关闭4年前。Improvethisquestion我想在固定时间创建一系列低音和高音调的哔哔声。例如:在150毫秒时发出高音调的蜂鸣声在151毫秒时发出低音调的蜂鸣声200毫秒时发出低音调的蜂鸣声250毫秒的高音调蜂鸣声有没有办法在Ruby或Python中做到这一点?我真的不在乎输出编码是什么(.wav、.mp3、.ogg等等),但我确实想创建一个输出文件。
Rails2.3可以选择随时使用RouteSet#add_configuration_file添加更多路由。是否可以在Rails3项目中做同样的事情? 最佳答案 在config/application.rb中:config.paths.config.routes在Rails3.2(也可能是Rails3.1)中,使用:config.paths["config/routes"] 关于ruby-on-rails-Rails3中的多个路由文件,我们在StackOverflow上找到一个类似的问题
我有一个模型:classItem项目有一个属性“商店”基于存储的值,我希望Item对象对特定方法具有不同的行为。Rails中是否有针对此的通用设计模式?如果方法中没有大的if-else语句,这是如何干净利落地完成的? 最佳答案 通常通过Single-TableInheritance. 关于ruby-on-rails-Rails-子类化模型的设计模式是什么?,我们在StackOverflow上找到一个类似的问题: https://stackoverflow.co
我有多个ActiveRecord子类Item的实例数组,我需要根据最早的事件循环打印。在这种情况下,我需要打印付款和维护日期,如下所示:ItemAmaintenancerequiredin5daysItemBpaymentrequiredin6daysItemApaymentrequiredin7daysItemBmaintenancerequiredin8days我目前有两个查询,用于查找maintenance和payment项目(非排他性查询),并输出如下内容:paymentrequiredin...maintenancerequiredin...有什么方法可以改善上述(丑陋的)代
我正在使用的第三方API的文档状态:"[O]urAPIonlyacceptspaddedBase64encodedstrings."什么是“填充的Base64编码字符串”以及如何在Ruby中生成它们。下面的代码是我第一次尝试创建转换为Base64的JSON格式数据。xa=Base64.encode64(a.to_json) 最佳答案 他们说的padding其实就是Base64本身的一部分。它是末尾的“=”和“==”。Base64将3个字节的数据包编码为4个编码字符。所以如果你的输入数据有长度n和n%3=1=>"=="末尾用于填充n%
我主要使用Ruby来执行此操作,但到目前为止我的攻击计划如下:使用gemsrdf、rdf-rdfa和rdf-microdata或mida来解析给定任何URI的数据。我认为最好映射到像schema.org这样的统一模式,例如使用这个yaml文件,它试图描述数据词汇表和opengraph到schema.org之间的转换:#SchemaXtoschema.orgconversion#data-vocabularyDV:name:namestreet-address:streetAddressregion:addressRegionlocality:addressLocalityphoto:i