我做了一个代码,在一个文件中读取256x256矩阵,将它们转换成二进制数,读取其中的一部分,生成另外两个256x256矩阵文件。我想它正在做我想做的,但是处理一个文件需要几分钟。有什么更有效的代码建议吗?在
这是我的密码。在
#Read in file
f = open(path, 'r')
l = [list(map(int, line.split(' '))) for line in f]
a = np.array(l)
A = a.ravel()
#Convert to binary
bnry = ()
for data in A:
bnry = np.append(bnry, bin(data))
#Extract two data from each number and store them to 'THL' and 'THH'
thl = ()
thh = ()
THL = ()
THH = ()
for ths in bnry:
thl = int(ths[2:14], 2)
THL = np.append(THL, thl)
thh = int(ths[-12:], 2)
THH = np.append(THH, thh)
#Save 'THL' and 'THH' to text files
np.savetxt('THL.txt', np.reshape(THL, (256,256)), fmt='%.4g', delimiter=' ')
np.savetxt('THH.txt', np.reshape(THH, (256,256)), fmt='%.4g', delimiter=' ')
解决方案 多亏了oliverw,我能够得到一个比我几分钟长的代码快得多的更短的代码。基本上是这样
^{pr2}$ 我还需要更多的学习,熟悉他们是如何工作的,但是他们工作得太好了!在
你要提取一系列整数的前12位和后12位。这是两个截然不同的问题。后者是最容易的。在
首先,让我们从使用
numpy
的方便方法从文本文件中读入数据,而不是捏造我们自己的(更可能是不太理想的)函数:接下来,我们来解决一个简单的问题:从a中提取最低的12位:
^{pr2}$这是一个矢量化的操作,所以它非常高效而且非常快速。在
然而,获得前12位是另一个问题,因为它取决于数字本身。我的猜测是,这实际上不是你想做的,而是有人要求你从一些整数中提取12个“最高”位,当它们被解释为具有固定的位数时。用“最高的3位”来解释会更清楚:
如果你需要一个数字的3个最高位,比如说20,你可以把20解释为写成
0b10100
,在这种情况下,最高的3位是101
,这是十进制数5。但是,如果您将20解释为0b0010100
,那么有2个前导零,那么最高的3位将是001
,这是十进制数1。实际上没有多少操作需要考虑(最小)二进制表示的长度,我想这也是为什么你说“我认为它在做我想要的”。在因此,更有可能的是,你的数字将被解释为二进制格式,长度固定。看看你提到的最大值268374015,这个长度可能是28位(即使看起来不太可能,32位更常见)。但是,假设它是28位,并且您只想提取前12位,您可以使用与之前相同的技巧:
注意,}是{a1}。在
>>
和{不过,我对你的数据做了几个假设(很明显,你只处理整数,因为你要用
int()
来转换一切),当然还有你的实问题。在但是,如果您真的希望从这些数字的前12位开始,从最高有效位开始,那么下面的代码将向您显示:
method_old()
)method_new()
)以及他们在我机器上的执行时间。在
相关问题 更多 >
编程相关推荐