我有两个字符串的单元格数组,我想检查它们是否包含相同的字符串(它们不必按相同的顺序排列,也不知道它们是否具有相同的长度).
例如:
a = {'2' '4' '1' '3'};
b = {'1' '2' '4' '3'};
Run Code Online (Sandbox Code Playgroud)
要么
a = {'2' '4' '1' '3' '5'};
b = {'1' '2' '4' '3'};
Run Code Online (Sandbox Code Playgroud)
首先我想到了,strcmp但它需要循环一个单元格内容并与另一个进行比较.我也考虑ismember使用类似的东西:
ismember(a,b) & ismember(b,a)
Run Code Online (Sandbox Code Playgroud)
但是我们事先并不知道它们的长度相同(显然是不平等的情况).那么,如果不编写过多的if/else案例,你将如何以最有效的方式进行这种比较.
我目前正在尝试计算10.000 x 10.000数组值中所有子方格总和的总和.例如,如果我的数组是:
1 1 1
2 2 2
3 3 3
Run Code Online (Sandbox Code Playgroud)
我希望结果如下:
1+1+1+2+2+2+3+3+3 [sum of squares of size 1]
+(1+1+2+2)+(1+1+2+2)+(2+2+3+3)+(2+2+3+3) [sum of squares of size 2]
+(1+1+1+2+2+2+3+3+3) [sum of squares of size 3]
________________________________________
68
Run Code Online (Sandbox Code Playgroud)
所以,作为第一次尝试,我写了一个非常简单的python代码来做到这一点.因为它在O(k ^ 2.n ^ 2)中(n是大数组的大小,k是我们得到的子方形的大小),处理非常长.我在O(n ^ 2)中写了另一个算法来加速它:
def getSum(tab,size):
n = len(tab)
tmp = numpy.zeros((n,n))
for i in xrange(0,n):
sum = 0
for j in xrange(0,size):
sum += tab[j][i]
tmp[0][i] = sum
for j in xrange(1,n-size+1):
sum += (tab[j+size-1][i] - tab[j-1][i])
tmp[j][i] …Run Code Online (Sandbox Code Playgroud) 我需要创建一个2D数组,其中每一行可以以不同的数字开头和结尾.假设每行的第一个和最后一个元素被给出,所有其他元素只是根据行的长度进行插值在一个简单的例子中,假设我想创建一个3X3数组,其相同的开始位于0但不同的结尾由W给出:
array([[ 0., 1., 2.],
[ 0., 2., 4.],
[ 0., 3., 6.]])
Run Code Online (Sandbox Code Playgroud)
有没有比以下更好的方法:
D=np.ones((3,3))*np.arange(0,3)
D=D/D[:,-1]
W=np.array([2,4,6]) # last element of each row assumed given
Res= (D.T*W).T
Run Code Online (Sandbox Code Playgroud) python numpy vectorization multidimensional-array numpy-broadcasting
Numpy 具有该random.choice功能,可让您从分类分布中进行采样。你会如何在一个轴上重复这个?为了说明我的意思,这是我当前的代码:
categorical_distributions = np.array([
[.1, .3, .6],
[.2, .4, .4],
])
_, n = categorical_distributions.shape
np.array([np.random.choice(n, p=row)
for row in categorical_distributions])
Run Code Online (Sandbox Code Playgroud)
理想情况下,我想消除 for 循环。
我来自R和Matlab多年的julia,其中矢量化代码是性能的关键,并影响了我的思考.现在,阅读S. Johnson的这篇精彩博客文章"更多点"我确信朱莉娅的句法循环融合是该语言的一个很好的特征,但在移植我以前的矢量化代码时让我有点困惑.
将一些函数矢量化为几个参数是不好/差的形式?- 当我想迭代一个数组时,我是否应该编写所有例程的"标量"版本并调用点版本(或广播/地图)?
为了争论,请说我写下面的内容
function sphere_vol(r)
return 4/3*pi*r^3
end
Run Code Online (Sandbox Code Playgroud)
然后在另一个函数中使用它,
function density(N, r)
V = sphere_vol(r)
return N/V
end
Run Code Online (Sandbox Code Playgroud)
等等(很多函数互相调用).我的直觉(来自其他语言)是在方便时将大多数函数定义为矢量化,如sphere_vol(r) = 4/3*pi*r.^3(微不足道的变化).有没有任何意义,如果我可以自动调用sphere_vol.(r::Array)(或map(sphere_vol, r::Array)?对于单参数函数,这不是一个重要的决定,但对于多个参数,它可以显着改变实现:我可以定义矢量化的density(N, r)矢量化版本以上r,或通过N,或两者(返回矩阵),但它更琐碎写这种方式(需要通过调用内部的广播sphere_vol.()和./),在R和Matlab的我做出了这个选择对案件逐案基础上与此妥协:
矢量化更方便,更有效:我可以调用density(N::Vector, r::Vector)一次并获得完整的数组值.
在几个参数上写一个矢量化函数很快变得很麻烦和/或难以管理(2个参数通常可以用一些技巧); 特别是当返回值不是标量时.
在朱莉娅实施新功能时,我不知道如何进行判断.
如果说在朱莉娅,我最好只编写上面的"标量"版本吗?或者,如果对某些参数进行矢量化(例如Bessel,它调用Fortran例程的特殊函数),某些例程会更有效吗?我猜测有一个微妙的平衡(根据品味/风格,但也),但与R或Matlab相比,对性能的影响要小得多.
我有一些嵌套循环(总共三个),我试图使用 numpy.einsum 来加速计算,但我正在努力使符号正确。我设法摆脱了一个循环,但我无法弄清楚另外两个。这是我到目前为止所得到的:
import numpy as np
import time
def myfunc(r, q, f):
nr = r.shape[0]
nq = q.shape[0]
y = np.zeros(nq)
for ri in range(nr):
for qi in range(nq):
y[qi] += np.einsum('i,i',f[ri,qi]*f[:,qi],np.sinc(q[qi]*r[ri,:]/np.pi))
return y
r = np.random.random(size=(1000,1000))
q = np.linspace(0,1,1001)
f = np.random.random(size=(r.shape[0],q.shape[0]))
start = time.time()
y = myfunc(r, q, f)
end = time.time()
print(end-start)
Run Code Online (Sandbox Code Playgroud)
虽然这比原来快得多,但这仍然太慢,大约需要 30 秒。请注意,没有 einsum 调用的原始内容如下(看起来需要大约 2.5 小时,迫不及待地想确定):
def myfunc(r, q, f):
nr = r.shape[0]
nq = q.shape[0]
y = np.zeros(nq)
for ri in range(nr): …Run Code Online (Sandbox Code Playgroud) 更新到 GCC 12.1 后,我的项目中出现array subscript \xe2\x80\x98__m256d_u[0]\xe2\x80\x99 is partly outside array bounds错误(或者更确切地说带有 的警告-Werror),因此我尝试隔离问题。
这是一个 MWE,我也将其放在godbolt上(改为矢量类型__m512d_u,但否则是相同的错误):
#include <Eigen/Dense>\n#include <iostream>\n\nusing Eigen::Array;\n\nArray<double, 3, 2> foo(){\n\n Array<double, 2, 2> a;\n a.setRandom();\n\n Array<double, 3, 2> b;\n b.col(0).tail(2) = a.col(1);\n // b.col(0).template tail<2>() = a.col(1);\n\n return b;\n}\n\nint main(){\n std::cout << foo() << \'\\n\';\n return 0;\n}\nRun Code Online (Sandbox Code Playgroud)\n相关的编译选项有-Wall -Wextra -Werror -O3 -march=native,以及错误信息注释note: at offset [16, 24] into object \xe2\x80\x98a\xe2\x80\x99 of size 32。
在以下情况下不会出现该错误: …
我有一个与 Java 17 新的 Vector API 功能中的 pow() 函数相关的问题。我正在尝试以矢量化方式实现布莱克斯科尔斯公式,但我很难获得与标量实现相同的性能
\n代码如下:
\n以下是一些代码片段:
\n public static double[] createArray(int arrayLength)\n {\n double[] array0 = new double[arrayLength];\n for(int i=0;i<arrayLength;i++)\n {\n array0[i] = 2.0;\n }\n return array0;\n } \nRun Code Online (Sandbox Code Playgroud)\n @Param({"256000"})\n int arraySize;\n public static final VectorSpecies<Double> SPECIES = DoubleVector.SPECIES_PREFERRED;\n DoubleVector vectorTwo = DoubleVector.broadcast(SPECIES,2);\n DoubleVector vectorHundred = DoubleVector.broadcast(SPECIES,100);\n\n double[] scalarTwo = new double[]{2,2,2,2};\n double[] scalarHundred = new double[]{100,100,100,100};\n\n @Setup\n public void …Run Code Online (Sandbox Code Playgroud) 我正在尝试在我的 mac 上安装 postgres 矢量扩展,但我得到了
ERROR: extension "vector" has no installation script nor update path for version "0.4.0".
Run Code Online (Sandbox Code Playgroud)
这就是我所做的:

但是当我运行时CREATE EXTENSION vector;出现错误:
ERROR: could not open extension control file "/Applications/Postgres.app/Contents/Versions/13/share/postgresql/extension/vector.control": No such file or directory
Run Code Online (Sandbox Code Playgroud)
我使用以下命令将 pgvector 的内容复制到 posgresql/extension 中:
sudo cp -r ~/Downloads/pgvector/* /Applications/Postgres.app/Contents/Versions/13/share/postgresql/extension/
现在尝试运行,CREATE EXTENSION vector;错误是:
ERROR: extension "vector" has no installation script nor update path for version "0.4.0".
Run Code Online (Sandbox Code Playgroud)
这里有人见过这个问题吗?
顺便说一下我正在使用PostgreSQL 13.10
我的数据框结构如下:
group maybe_start maybe_end
0 ABC False False
1 ABC True False
2 ABC False False
3 ABC False False
4 ABC True False
5 ABC False False
6 ABC False True
7 ABC False False
8 DEF False False
9 DEF False False
10 DEF True False
11 DEF False False
12 DEF False True
13 DEF False False
14 DEF False False
15 DEF False True
16 DEF True False
17 DEF False False
18 DEF False True …Run Code Online (Sandbox Code Playgroud) vectorization ×10
python ×5
numpy ×4
arrays ×2
performance ×2
algorithm ×1
broadcasting ×1
c++ ×1
cell-array ×1
comparison ×1
eigen ×1
eigen3 ×1
java ×1
java-17 ×1
julia ×1
matlab ×1
numpy-einsum ×1
pandas ×1
postgresql ×1
random ×1
simd ×1
string ×1