我有3247 197x10尺寸矩阵。我需要扫描它们,如果值大于1,则将其设置为1.如果值小于或等于1,我想将其设置为零。然后,我必须采用这个修改过的矩阵并将其添加到其他3246集的修改矩阵中。以下是我到目前为止的情况:
for i in range(LOWER, UPPER + 1):
fname = file_name+str(i)+".txt"
cur_resfile = np.genfromtxt(fname, delimiter = ",", skiprows = 1)
m_cur = cur_resfile
m_cur[m_cur <= 1] = 0
m_cur[m_cur > 1 ] = 1
m_ongoing = m_ongoing + m_cur
我希望m_ongoing保留正在运行的总和,以便我可以将其保存到文件中。但是,它不起作用,似乎只是在循环中编写最后一个m_cur。如果我总共运行3次循环,那么有些单元格都相互有1,所以我期待几个三分。我绝对期待很多2s,但我只看到1s和0s。
做我想做的最好的方法是什么?
- 根据条件
更改值- 获取大量矩阵并逐个元素添加以为每个单元格创建运行总和。
答案 0 :(得分:1)
您可以使用numpy.clip()
for i in range(LOWER, UPPER + 1):
fname = file_name+str(i)+".txt"
cur_resfile = np.genfromtxt(fname, delimiter = ",", skiprows = 1)
m_ongoing += cur_resfile.clip(0,1)
编辑回答提出的问题:
m_ongoing = np.zeros((197,10))
for i in range(LOWER, UPPER + 1):
fname = file_name+str(i)+".txt"
cur_resfile = np.genfromtxt(fname, delimiter = ",", skiprows = 1)
# add one to the places where cur_file > 1
m_ongoing[cur_resfile > 1] += 1
答案 1 :(得分:0)
正如@RootTwo建议的那样,clip()是一个很好的numpy内置。但出于性能原因,您可以在3D&#34;堆栈上使用矢量化操作&#34;你的数据。
示例:
import numpy as np
#simulating your data as a list of 3247 2D matrices, each 197x10
some_data = [np.random.randint(-2,2,(197,10)) for _i in range(3247)]
#stack the matrices
X = np.dstack(some_data)
print(X.shape)
(197,10,3247)
Y = X.clip(0,1)
Z = Y.sum(axis=2)
#Z is now the output you want!
print(Z.shape)
(197,10)
编辑:添加时间结果,并更改我的答案
所以看来我建议创建一个深度堆栈并使用剪辑和求和函数的单个应用程序是不明智的。我运行了一些时序测试,发现增量方法更快,很可能是由于分配大型3D阵列的分配时间开销。
这里是测试,我将数据加载方面分解出来,因为两种方式都是相同的。以下是将ipython中的两种方法与%timeit
宏进行比较的结果。
import numpy as np
# some_data is simulated as in the above code sample
def f1(some_data):
x = some_data[0]
x = x.clip(0,1)
for y in some_data[1:]:
x += y.clip(0,1)
return x
def f2(some_data):
X = np.dstack(some_data)
X = X.clip(0,1)
X = X.sum(axis=2)
return X
%timeit x1 = f1(some_data)
10个循环,最佳3:28.1毫秒/循环
%timeit x2 = f2(some_data)
10个循环,最佳3:每循环103 ms
因此,在堆叠数据后,通过逐步执行流程与单个操作相比,可实现3.7倍的加速。