如何实现numpy数组间赋值并正确处理分数类型数据?
解决numpy数组用分数类型索引赋值的问题
看起来你遇到的问题是:当索引数组c是整数类型时,b = a[c]这类赋值操作正常,但c换成分数(比如fractions.Fraction)类型后就出问题了,对吧?
这其实是因为numpy的数组索引只支持整数、布尔值或者特定的数值类型(比如uint),而Fraction对象属于Python的自定义类型,numpy没法直接把它当成索引来用——哪怕这个分数的数值刚好是整数也不行。
下面给你两种针对性的解决方法,根据你的具体场景选:
场景1:c里的分数都是整数等价的(比如Fraction(2,1)、Fraction(0,1))
这种情况最简单,直接把c转换成整数类型的numpy数组就行:
import numpy as np from fractions import Fraction # 示例数组 a = np.array([10, 20, 30, 40]) c = np.array([Fraction(0,1), Fraction(2,1), Fraction(3,1)]) # 把分数数组转成整数数组 c_int = np.array([int(frac) for frac in c]) # 或者用astype(前提是分数都是整数,否则会截断小数部分) # c_int = c.astype(int) # 正常赋值 b = a[c_int] print(b) # 输出: [10 30 40]
这里int(frac)会直接把整数形式的分数转换成对应的整数,比如Fraction(2,1)转成2,完全符合你原来整数索引的逻辑。
场景2:c里的分数是比例值(比如Fraction(1,4)对应数组1/4位置的元素)
如果你的c是按数组长度的比例来表示索引的,那需要先把比例转换成对应的整数索引:
import numpy as np from fractions import Fraction a = np.array([10, 20, 30, 40]) # 比如c表示数组的1/4和3/4位置 c = np.array([Fraction(1,4), Fraction(3,4)]) # 计算对应的整数索引:比例 × 数组长度 c_int = (c * len(a)).astype(int) b = a[c_int] print(b) # 输出: [20 40]
这种方法会把比例映射到数组的实际索引位置,适合需要按比例取元素的场景。
注意事项
- 如果
c里有非整数的分数(比如Fraction(3,2)),直接转整数会截断小数部分(变成1),这时候你可能需要先处理这些分数(比如四舍五入),再转索引:c = np.array([Fraction(3,2), Fraction(5,2)]) c_int = np.round(c.astype(float)).astype(int) b = a[c_int] - 确保转换后的索引在数组
a的有效范围内(0到len(a)-1),否则会抛出索引越界错误。
内容的提问来源于stack exchange,提问作者Ankur
相关产品推荐
相关产品推荐

