问题 我想从我的主管未发表的论文中实现一个算法,作为其中的一部分,我需要使用论文中给出的一些规则构造一个协方差矩阵 C。我来自 Matlab,想借此机会最终学习 Python,因此我的问题是:如何在 Python(包括 numpy、scipy)中以最有效(快速)的方式做到这一点?
子问题 1:
有没有更好的方法?
子问题 2
我相当确信子问题 1 很简单,但我不知道子问题 2。我可能还应该说我正在处理的矩阵可能是 2*10^4 x 2*10^ 4.
谢谢!
编辑 我不想给出实际的协方差矩阵,但由于人们想要一个例子,假设我们想要构建一个称为“布朗桥”的随机过程的协方差矩阵。它的结构由下式给出:
cov(Xs, Xt) = min{s,t} − st
假设 s,t ∈ {1,...,100}。你会如何构建它?
最佳答案
首先,对于将来可能会遇到此问题的其他人:如果您确实有数据并且想要估计协方差矩阵,正如一些人指出的那样,请使用 np.cov 或类似的东西。
但是,您的问题是关于如何在给定一些预定义规则的情况下构建大型矩阵。为了消除评论中的一些困惑:你的问题似乎不是关于估计协方差矩阵,而是关于指定一个。换句话说,您是在询问如何根据一些预定义的规则构建一个大型数组。
哪种方式最有效取决于您的具体操作。在这种情况下,大多数性能技巧将涉及在您正在执行的计算中利用对称性。 (例如,一行是否相同?)
如果不知道自己在做什么,就很难说出任何具体的内容。因此,我将重点介绍一般情况下如何做这类事情。 (注意:我刚刚注意到您的编辑。稍后我将包含一个布朗桥的示例...)
最基本的情况是输出数组中的常量行或列。使用切片语法很容易创建数组并将值分配给列或行:
import numpy as np
num_vars = 10**4
cov = np.zeros((num_vars, num_vars), dtype=float)
设置整列/行:
# Third column will be all 9's
cov[:,2] = 9
# Second row will be all 1's (will overwrite the 9 in col3)
cov[1,:] = 1
您还可以将数组分配给列/行:
# 5th row will have random values
cov[4,:] = np.random.random(num_vars)
# 6th row will have a simple geometric sequence
cov[5,:] = np.arange(num_vars)**2
在许多情况下(但可能不是这种情况)您会希望从现有数组构建输出。您可以为此使用 vstack/hstack/column_stack/tile 和许多其他类似函数。
一个很好的例子是,如果我们要为多项式的线性求逆建立一个矩阵:
import numpy as np
num = 10
x = np.random.random(num) # Observation locations
# "Green's functions" for a second-order polynomial
# at our observed locations
A = np.column_stack([x**i for i in range(3)])
但是,这将建立几个临时数组(在本例中为三个)。如果我们使用 10000 维多项式和 10^6 个观测值,上述方法会使用太多 RAM。因此,您可以改为遍历列:
ndim = 2
A = np.zeros((x.size, ndim + 1), dtype=float)
for j in range(ndim + 1):
A[:,j] = x**j
在大多数情况下,不必担心临时数组。除非您使用相对较大的数组,否则基于 colum_stack 的示例是正确的方法。
没有更多信息,我们无法利用任何对称性。最通用的方法就是遍历。通常您会希望避免这种方法,但有时这是不可避免的(尤其是在计算取决于先前值的情况下)。
在速度方面这与嵌套 for 循环相同,但使用 np.ndindex 而不是多个 for 循环更容易(尤其是对于 >2D 数组):
import numpy as np
num_vars = 10**4
cov = np.zeros((num_vars, num_vars), dtype=float)
for i, j in np.ndindex(cov.shape):
# Logic presumably in some function...
cov[i, j] = calculate_value(i, j)
如果很多情况,你可以向量化基于索引的计算。换句话说,直接对输出的索引数组进行操作。
假设我们有如下代码:
import numpy as np
cov = np.zeros((10, 10)), dtype=float)
for i, j in np.ndindex(cov.shape):
cov[i,j] = i*j - i
我们可以将其替换为:
i, j = np.mgrid[:10, :10]
cov = i*j - i
作为另一个例子,让我们构建一个 100 x 100 的“倒圆锥”值:
# The complex numbers in "mgrid" give the number of increments
# mgrid[min:max:num*1j, min:max:num*1j] is similar to
# meshgrid(linspace(min, max, num), linspace(min, max, num))
y, x = np.mgrid[-5:5:100j, -5:5:100j]
# Our "inverted cone" is just the distance from 0
r = np.hypot(x, y)
这是一个可以轻松矢量化的好例子。如果我没看错你的例子,你会想要类似的东西:
import numpy as np
st = np.mgrid[1:101, 1:101]
s, t = st
cov = st.min(axis=0) - s * t
总的来说,我只谈到了几个一般模式。但是,希望这能让您指明正确的方向。
关于python - 在 Python 中构建协方差矩阵,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33548166/
关闭。这个问题是opinion-based.它目前不接受答案。想要改进这个问题?更新问题,以便editingthispost可以用事实和引用来回答它.关闭4年前。Improvethisquestion我想在固定时间创建一系列低音和高音调的哔哔声。例如:在150毫秒时发出高音调的蜂鸣声在151毫秒时发出低音调的蜂鸣声200毫秒时发出低音调的蜂鸣声250毫秒的高音调蜂鸣声有没有办法在Ruby或Python中做到这一点?我真的不在乎输出编码是什么(.wav、.mp3、.ogg等等),但我确实想创建一个输出文件。
这个问题在这里已经有了答案:关闭10年前。PossibleDuplicate:Pythonconditionalassignmentoperator对于这样一个简单的问题表示歉意,但是谷歌搜索||=并不是很有帮助;)Python中是否有与Ruby和Perl中的||=语句等效的语句?例如:foo="hey"foo||="what"#assignfooifit'sundefined#fooisstill"hey"bar||="yeah"#baris"yeah"另外,类似这样的东西的通用术语是什么?条件分配是我的第一个猜测,但Wikipediapage跟我想的不太一样。
什么是ruby的rack或python的Java的wsgi?还有一个路由库。 最佳答案 来自Python标准PEP333:Bycontrast,althoughJavahasjustasmanywebapplicationframeworksavailable,Java's"servlet"APImakesitpossibleforapplicationswrittenwithanyJavawebapplicationframeworktoruninanywebserverthatsupportstheservletAPI.ht
在编写Ruby(客户端脚本)时,我看到了三种构建更长字符串的方法,包括行尾,所有这些对我来说“闻起来”有点难看。有没有更干净、更好的方法?变量递增。ifrender_quote?quote="NowthatthereistheTec-9,acrappyspraygunfromSouthMiami."quote+="ThisgunisadvertisedasthemostpopularguninAmericancrime.Doyoubelievethatshit?"quote+="Itactuallysaysthatinthelittlebookthatcomeswithit:themo
点向量坐标矩阵的几何意义介绍旋转矩阵的几何含义之前,先介绍一下点向量坐标矩阵的几何含义点:在一维空间下就是一个标量,如同一条直线上,以任意某一个位置为0点,以一定的尺度间隔为1,2,3...,相反方向为-1,-2,-3...;如此就形成了一维坐标系,这时候任何一个点都可以用一个数值表示,如点p1=5,即即从原点出发沿着x轴正方向移动5个尺度;点p2=-3,负方向移动3个尺度; 在一维坐标系上过原点做垂直于一维坐标系的直线,则形成了二维坐标系,此时描述一个点需要两个数值来表示点p3=(3,2),即从原点出发沿着x轴正方向移动3个尺度,在此基础上沿着y轴正方向移动两个尺度的位置就是点p3。
华为OD机试题本篇题目:明明的随机数题目输入描述输出描述:示例1输入输出说明代码编写思路最近更新的博客华为od2023|什么是华为od,od薪资待遇,od机试题清单华为OD机试真题大全,用Python解华为机试题|机试宝典【华为OD机试】全流程解析+经验分享,题型分享,防作弊指南华为o
我想解析一个已经存在的.mid文件,改变它的乐器,例如从“acousticgrandpiano”到“violin”,然后将它保存回去或作为另一个.mid文件。根据我在文档中看到的内容,该乐器通过program_change或patch_change指令进行了更改,但我找不到任何在已经存在的MIDI文件中执行此操作的库.他们似乎都只支持从头开始创建的MIDI文件。 最佳答案 MIDIpackage会为您完成此操作,但具体方法取决于midi文件的原始内容。一个MIDI文件由一个或多个音轨组成,每个音轨是十六个channel中任何一个上的
本文主要介绍在使用Selenium进行自动化测试或者任务时,对于使用了iframe的页面,如何定位iframe中的元素文章目录场景描述解决方案具体代码场景描述当我们在使用Selenium进行自动化测试的时候,可能会遇到一些界面或者窗体是使用HTML的iframe标签进行承载的。对于iframe中的标签,如果直接查找是无法找到的,会抛出没有找到元素的异常。比如近在咫尺的例子就是,CSDN的登录窗体就是使用的iframe,大家可以尝试通过F12开发者模式查看到的tag_name,class_name,id或者xpath来定位中的页面元素,会抛出NoSuchElementException异常。解决
2022/8/4更新支持加入水印水印必须包含透明图像,并且水印图像大小要等于原图像的大小pythonconvert_image_to_video.py-f30-mwatermark.pngim_dirout.mkv2022/6/21更新让命令行参数更加易用新的命令行使用方法pythonconvert_image_to_video.py-f30im_dirout.mkvFFMPEG命令行转换一组JPG图像到视频时,是将这组图像视为MJPG流。我需要转换一组PNG图像到视频,FFMPEG就不认了。pyav内置了ffmpeg库,不需要系统带有ffmpeg工具因此我使用ffmpeg的python包装p
ValidPalindromeGivenastring,determineifitisapalindrome,consideringonlyalphanumericcharactersandignoringcases. [#125]Example:"Aman,aplan,acanal:Panama"isapalindrome."raceacar"isnotapalindrome.Haveyouconsiderthatthestringmightbeempty?Thisisagoodquestiontoaskduringaninterview.Forthepurposeofthisproblem