【发布时间】:2015-03-21 10:31:47
【问题描述】:
假设我们从一个整数 numpy 数组开始,整数在 0 到 99 之间,即
x = np.array([[1,2,3,1],[10,5,0,2]],dtype=int)
现在我们想用一个唯一值来表示这个数组中的行。一种简单的方法是将其表示为浮点数。一种直观的方法是
rescale = np.power(10,np.arange(0,2*x.shape[1],2)[::-1],dtype=float)
codes = np.dot(x,rescale)
我们利用整数最多有 2 个数字。 (我将rescale 转换为浮点数以避免超过 int 的最大值,以防x 的条目有更多元素;这不是很优雅)
返回
array([ 1020301., 10050002.])
如何将这个过程反过来再次获得x?
我正在考虑将codes 转换为字符串,然后每隔第二个条目拆分一次字符串。我对这些字符串操作不太熟悉,尤其是当它们必须同时在数组的所有条目上执行时。还有一个问题是第一个数字的位数不同,因此必须以某种方式添加尾随零。
也许使用一些除法或四舍五入可以实现更简单的操作,或者以不同的方式重新排列数组的行。重要的是,至少初始转换是快速且矢量化的。
欢迎提出建议。
【问题讨论】:
-
您应该使用 100 而不是 10 的幂来定义重新缩放,并且您可以在创建它时直接反转范围而不是在取幂之后:
rescale = np.power(100, np.arange(x.shape[0]-1, 0, -1), dtype=float)。 -
@FrancisColas 太好了。在这里你需要
x.shape[1],顺便说一句。 -
是的,我刚刚复制了您的
x.shape[0]。这实际上应该是np.arange(x.shape[1]-1, -1, -1)。
标签: python arrays string numpy split