python 将Numpy数组乘以标量,使每个元素都成为整数

kmynzznz  于 12个月前  发布在  Python
关注(0)|答案(2)|浏览(322)

下面是Numpy数组。

a = np.array([0.1, 0.9, 0.17, 0.47, 0.5])

字符串
我怎样才能找到一个数字,当乘以数组时,每个元素都变成整数?
例如,在这种情况下,这个数字应该是100,因为a乘以100会使每个元素都是整数。

>>> a * 100
array([10., 90., 17., 47., 50.])


我试过用10的最长十进制数的幂来计算,但是,我需要找到一个可能的最小数(而且它必须大于0)。

b = np.array([1.0, 0.5, 0.25, 0.75, 0.5])


因此,在这种情况下,该数字应该是4而不是100

>>> b * 4
array([4., 2., 1., 3., 2.])

bxgwgixi

bxgwgixi1#

从你的策略开始。得到使你的数组成为整数的10的最小幂。然后将它转换为整数并得到公约数。你想要的数字是10的幂除以公约数:

b = np.array([1.0, 0.5, 0.25, 0.75, 0.5])
d = np.gcd.reduce((b * 100).astype(int))

字符串
这里d是25,你想要的数字是100/254

ojsjcaue

ojsjcaue2#

可接受的答案可以通过使用import fractions来扩展,以便它包括找到“公差”,即“使数组整数的10的最小幂”。这使得解决任意实值浮点数变得更容易。
以下是原始示例和当前接受的答案:

b = np.array([1.0, 0.5, 0.25, 0.75, 0.5])
d = np.gcd.reduce((b * 100).astype(int))
print(100/d, 100/d*b)

字符串
输出:4.0 [4. 2. 1. 3. 2.]
如果未调整最小幂10,则以下示例不适用于当前接受的答案:

b = np.array([1./5, 2./11, 3./15, 4./9, 5./21])
d = np.gcd.reduce((b * 100).astype(int))
print(100/d, 100/d*b)


输出:100.0 [20. 18.18181818 20. 44.44444444 23.80952381]
但是有了这个解决方案,你不需要先找到10的最小幂:

b = np.array([1.0, 0.5, 0.25, 0.75, 0.5])
d = np.lcm.reduce([fractions.Fraction(x).limit_denominator().denominator for x in b])
print(d, d*b)

b = np.array([1./5, 2./11, 3./15, 4./9, 5./21])
d = np.lcm.reduce([fractions.Fraction(x).limit_denominator().denominator for x in b])
print(d, d*b)


它仍然适用于原始示例,输出:4 [4. 2. 1. 3. 2.]
但它也适用于新的示例,输出:3465 [ 693. 630. 693. 1540. 825.]
正如马克·迪金森(Mark Dickinson)对公认答案here的评论所指出的那样,它可能不适用于分数超过100万的分数。

相关问题