使用numpy,scipy或pylab打高尔夫球的技巧


10

还有已经为Python技巧的完整列表在这里,所以我要问的是专门适用于使用技巧numpyscipypylab库。

这些既可以是已经使用缩短代码的方法,也可以是numpy通过使用这些库缩短常用python操作的方法。

请给每个答案一个提示。


请注意,在已弃用的通用名称空间中,pylab它只是matplotlib.pyplot+ numpy。从意义上讲,它们的导入具有相同的字节数,因此这numpy部分pylab是微不足道的,因此只能从中得出绘图内容pylab,但是我怀疑这并不是您要考虑的问题。
安德拉斯·迪克

2
@AndrasDeak,我知道使用pylab被认为是不好的做法,但是在codegolf中很少被认为是好的做法。Pylab直接包含许多numpy软件包的一部分。例如pylab.randint,在numpy需要的地方有效numpy.random.randint。因此对于打高尔夫球pylab应提供较短的代码。
user2699

1
我知道弃用不是问题,我的观点是它也没有任何好处。我只是没有意识到子包也被加载到pylab命名空间中!很抱歉,您说得很对:)
Andras Deak

Answers:


5

利用Numpy的广播

广播是指沿其某些单维度复制多维数组以匹配另一个数组的大小。将算术运算符应用于Numpy数组时,这会自动发生。

例如,要生成10×10乘法表,可以使用

import numpy
t=numpy.arange(1,11)
print(t*t[:,None]) # Or replace t[:,None] by [*zip(t)]

在线尝试!

在这里t创建为Numpy数组[1, 2, ..., 10]。它的形状为(10,),它等效于(1,10)。另一个操作数数组的t[:,None]大小为(10,1)。将两个数组相乘就隐式地复制了它们,因此它们的行为就像它们都具有形状(10,10)一样。结果也具有形状(10,10),其中包含原始数组中所有条目对的乘积。


那是zip广播的巧妙用法,这是它自己的答案吗?
user2699

@ user2699我认为不值得单独回答,因为[*zip(t)]它的字节数与可读性相同t[:,None]。但是您是对的,可能值得注意,所以我在这里添加了它
Luis Mendo

好一点,我想我实际上并没有计算字节数。 [*zip(t)]如果有更多尺寸,则将短两个字节。
user2699 '18

1
请注意,在扩展迭代拆包[*zip(t)]只会工作在Python 3下
安德拉斯·迪克

我浏览此页面是因为我有兴趣找出Perl 6没有的numpy。无论如何,将其写为my \t = 1..10; .fmt('%3d').put for t «*» t[*,Empty]或可以使用zip(t)
Brad Gilbert b2gills

2

使用r _ [...]而不是range(...)

Numpy提供了类似于Matlab的语法,用于使用创建数组r_[...]。方括号之间的任何切片符号都将解释为具有指定范围的数组。因此,例如

r_[:30:4]

相当于

arange(0,30,4)

而且对于大多数用途可以替代

range(0,30 4)

它还可以处理更复杂的表达式。例如,要获取从0到10的索引,然后再次向下索引,

r_[:10,10:-1:-1]
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.