- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我经常潜伏在 Stack Overflow 上有一段时间了,每当我遇到编码问题时,我往往会从这里找到非常有用且清晰的信息。然而,我今天似乎找不到一个线索来解决我的具体问题。
今天早些时候,我学习了 Python 中的向量化函数,以加快计算速度。我目前正在尝试优化一个多月前编写的 python 程序。我的程序采用一个包含以下格式数据的文本文件:
<magnitude> <dmagnitude> <exposure_number>
然后,我将每一列分配给列表 mag
, dmag
,和expnum
.
我想要做的是创建 mag
的二维数组和dmag
共享相同的值 expnum
(具有相同的曝光数意味着 mag
和 dmag
指向相同的数据点)。
我对所有曝光数都这样做,最后,我取 mag
的中位数。和dmag
,以及 mag
的标准差对于每个基于曝光数的数组,并将它们全部组合成一个我可以绘制的数组。
目前,我有以下代码:
from numpy import loadtxt,array,asarray,append,std,median,empty,take
data = loadtxt(infile,usecols=(0,1,2))
mag = data1[:,2].tolist()
dmag = data1[:,3].tolist()
expnum = data1[:,4].tolist()
#initialize variables
indexing = list()
master_mag = list()
master_dmag = list()
sub_mag = list()
sub_dmag = list()
mag_std = array([])
mag_stdmed = array([])
mag_med = array([])
while len(mag) > 0:
num=expnum[0]
for i in range(0,len(expnum)):
if expnum[i] == num:
sub_mag.append(mag[i])
sub_dmag.append(dmag[i])
indexing.append(i)
#add the sub lists to their master lists
master_mag.append(sub_mag)
master_dmag.append(sub_dmag)
sub_mag=list()
sub_dmag=list()
#remove from mag, dmag, and expnum the index referred to by indexing
while len(indexing) > 0:
mag.pop(indexing[-1])
dmag.pop(indexing[-1])
expnum.pop(indexing[-1])
indexing.pop()
#make the master mag and dmag lists into numpy arrays
master_mag=asarray(master_mag)
master_dmag=asarray(master_dmag)
#generate the mag and dmag median and mag std arrays
for i in range(0,len(master_mag)):
mag_std=append(mag_std,std(master_mag[i]))
mag_med=append(mag_med,median(master_mag[i]))
mag_stdmed=append(mag_stdmed,median(master_dmag[i]))
#create empty numpy arrays to be used for mag med vs. mag std
#and mag med vs. dmag med
med_std=empty([0,2])
med_dmed=empty([0,2])
#fill in those arrays
for i in range(0,len(mag_std)):
med_std=append(med_std,[[mag_med[i],mag_std[i]]],axis=0)
med_dmed=append(med_dmed,[[mag_med[i],mag_stdmed[i]]],axis=0)
#sort the median mag and dmag standard deviation arrays by median mag
order_med_std=med_std[:,0].argsort()
order_med_dmed=med_dmed[:,0].argsort()
sorted_med_std=take(med_std,order_med_std,0)
sorted_med_dmed=take(med_dmed,order_med_dmed,0)
然后我准备绘制 sorted_med_dmed[:,0]
与 sorted_med_dmed[:,1]
和sorted_med_std[:,0]
与 sorted_med_std[:,1]
这段代码可以工作,只是我觉得它太慢了(特别是当我需要处理超过 10,000 个数据点时)。我想尝试向量化这段代码以使其更快,但我不知道从哪里开始。
我需要一些帮助来弄清楚如何矢量化按曝光数匹配的组件。我想从一开始就创建一个多维数组,其格式为: array([[[mag],[dmag]],...])
长度等于不同曝光次数的数量。有没有一种方法可以生成和更新这样的内联数组,而不必使用大量循环?
如果您需要进一步了解此代码的具体用途,请告诉我。
感谢您的宝贵时间。
最佳答案
解决此类问题的第一步应该始终是分析。我建议尝试 line_profiler ,因为它可以轻松地从视觉上找到热点。 (您也可以尝试 Python 的内置分析器,但我发现它的输出更难解析。)
这应该能让您了解哪些部分最能减慢您的代码速度。无需亲自尝试,我可以提供一些建议:
append
,列表速度很快,但对于大多数其他操作,列表速度很慢,而且它们不支持矢量化。numpy.append
。每次调用都涉及分配更多内存和复制,这在循环中可能会非常慢。使用字典按键对数据进行分组。我发现 stdlib collections.defaultdict
对于这样的分组非常有用:
groups = defaultdict(list)
for a,b,key in data:
groups[key].append((a,b))
使用 numpy 的自动向量化函数调用,而不是在循环中调用函数。例如,这段代码:
#generate the mag and dmag median and mag std arrays
for i in range(0,len(master_mag)):
mag_std=append(mag_std,std(master_mag[i]))
mag_med=append(mag_med,median(master_mag[i]))
mag_stdmed=append(mag_stdmed,median(master_dmag[i]))
写成这样会快得多:
mag_std = numpy.std(master_mag, axis=0)
mag_meg = numpy.median(master_mag, axis=0)
mag_stdmed = numpy.median(master_dmag, axis=0)
关于python - 在 Python 中向量化多维函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25254023/
我的数据库表是: author book repeat ------ ----
众所周知,我们可以简化 SELECT * FROM A WHERE X=1 OR X=4 OR X=9 如下: SELECT * FROM A WHERE X IN (1,4,9) “多维”条件是否有
我在大学时正在编写 Android 应用程序。 用户被询问必须回答的问题。 我通过服务器的 HTTP 请求/响应获取问题。它们以字符串形式传递。该字符串看起来像这样,有两个问题: (requested
我怎样才能在 C++ 中使用 vector 制作这样的表格: 65 A 66 B 67 C 我是用这样的动态二维数组完成的: int** ary = new int*[2]; for (int
运行时: if (data.custaccount.webaddress) { alert('found it'); } 我得到了错误 data.custaccount is undefined
如何按名称对对象数组进行排序。 数组构造数组的例子: object[] o = new object[items.Count+(row-exists)]; int i = 0;
如何创建二维 vector ?我知道在二维数组中,我可以这样表达: a[0][1]=98; a[0][2]=95; a[0][3]=99; a[0][4]=910; a[1][0]=98; a[1][
这是我的第一个问题。 我有很多组数据。它们中的每一个都应该在 DataFrame 中呈现。我试图通过将 DataFrame 作为多维元组的一项来实现这一点,例如: data[0][1].Glucose
有人可以建议改进我对多维 lstm 的实现吗? 它非常慢并且使用大量内存。 class MultiDimentionalLSTMCell(tf.nn.rnn_cell.RNNCell): """ Ad
我已为我在另一个基于 WPF 的应用程序中使用的 Azure 移动服务添加了到 MVC 站点的连接。 我不太熟悉如何通过移动服务在 MVC 中显示数据,找不到任何很好的示例来展示如何在页面上(例如在网
这样写对吗?有没有更好的写法呢?这与我正在使用的真实数据类似,我想确保将对象或数组正确嵌套在 JSON 文件中。 var data = [ { "department": "I
我有一个HashMap当我调用 .toString() 时,它看起来像这样: {somekey=false, anotherKey=someString, thirdKey={nestedKey=he
是否有更 pythonic 的方式来执行以下操作: import numpy as np def diagonal(A): (x,y,y) = A.shape diags = []
我有以下结构: import java.util.LinkedHashMap; ... LinkedHashMap level0 = new LinkedHashMap(); LinkedHashMa
如何访问 Arraylist 中的整数数组(两者均可调整大小)? 到目前为止我有这个代码: List vertices_passed = new ArrayList(); 我想进入vertices_p
我想知道 MiniZinc 语言中是否可以有(多维)数组的数组。 确实,我想解决 worker 的时间表问题。我的目标是检查它们是否每周至少有 1 天可用。每个 worker 都由一个整数索引,我每周
这个问题已经有答案了: how is axis indexed in numpy's array? (5 个回答) 已关闭 3 年前。 我还没有理解 NumPy 中多维数组中的轴之间的区别。你能给我解
我试图 $.post 包含一些表单数据以及数组中的一些其他数据。我可以将数组插入表单数据的其余部分,但我丢失了数组中的键,并且数据仅表示为字符串,我想我要求的是多维数组? 这是当前的响应字符串: ar
我是 numpy 新手,试图理解 here 中的以下示例。我无法理解的输出 >>> palette[image] 当索引数组 a 是多维时,单个索引数组引用 a 的第一个维度。以下示例通过使用调色板将
这个问题已经有答案了: JavaScript associative array to JSON (5 个回答) JSON.stringify doesn't work with normal Jav
我是一名优秀的程序员,十分优秀!