标签: elementwise-operations

使用cellfun替换条件元素

vec = randi(10,10,1)
vec(vec < 5) = 0

func = @(x) x(x < 5) = 0    % This isn't valid
Run Code Online (Sandbox Code Playgroud)

我该如何将第二行代码转换为可以与之结合使用的函数句柄cellfun

matlab anonymous-function function-handle cell-array elementwise-operations

6
推荐指数
1
解决办法
112
查看次数

使用熊猫系列中前一个"行"的值

我有一个看起来像这样的CSV(当带入一个pandas Dataframe时 read_csv(),它看起来一样).

在此输入图像描述

我想根据以下逻辑更新列ad_requests中的值:

对于给定的行,如果ad_requests具有值,请不管它.否则,把它的值上一行对价值AD_REQUESTS减去前行的价值为印象.所以在第一个例子中,我们希望最终得到:

在此输入图像描述

我部分到了那里:

df["ad_requests"] = [i if not pd.isnull(i) else ??? for i in df["ad_requests"]]
Run Code Online (Sandbox Code Playgroud)

这就是我陷入困境的地方.之后else,我想"回去"并访问前一个"行",但我知道这不是大熊猫的意思.另外需要注意的是,行总是按行ad_tag_name分组为三个.如果我pd.groupby["ad_tag_name"],我可以把它变成一个list并开始切片和索引,但同样,我认为必须有更好的方法在熊猫中做到这一点(因为有很多东西).

Python:2.7.10

熊猫:0.18.0

python dataframe python-2.7 pandas elementwise-operations

5
推荐指数
1
解决办法
2519
查看次数

Numpy鸿沟与Python分歧之间的差异?

numpy.divide和Python斜杠/运算符之间有什么相同点和不同点?据我所知,他们的行为相同,都实现了元素划分.该numpy的文件中提到:

numpy.divide(x1,x2)......就阵列广播而言,相当于x1/x2....

暗示np.divide(x1,x2)并不完全等同于x1/x2.我运行了以下代码片段来比较它们的速度:

import numpy as np
import time

a = np.random.rand(10000, 10000)
b = np.random.rand(10000, 10000)

tic = time.time()
c = a / b
toc = time.time()
print("Python divide took: ", toc - tic)

tic = time.time()
c = np.divide(a, b)
toc = time.time()
print("Numpy divide took: ", toc - tic)
Run Code Online (Sandbox Code Playgroud)

似乎Python鸿沟通常运行得更快,这使我相信Numpy鸿沟实现了一些额外的花里胡哨.

任何帮助深表感谢!

python numpy division elementwise-operations

5
推荐指数
1
解决办法
4637
查看次数

R中的元素绑定

我想要一个f这样的功能

(outer(X, Y, f))[i, j]是X的第i个元素和Y的第j个元素的并排连接,类似于c(X[i], Y[j])或具有类似的结构.

此外,我希望这个结果能够重复这个过程,并且通过这种方式,我们得到了这个结果

(outer(outer(X, Y, f), Z, f))[i, j, k]是X的第i个元素,Y的第j个元素和Z的第k个元素的并排串联,即相等或具有类似于的结构c(X[i], Y[j], Z[k]).

最终我的目标是定义这样的函数:

foo <- function(a.list) {
  Reduce(function(x, y) outer(x, y, f), a.list)
}
Run Code Online (Sandbox Code Playgroud)

这样,如果

A <- foo(list(v_1, ..., v_p))
Run Code Online (Sandbox Code Playgroud)

dim(A)将是c(length(v_1), ..., length(v_p)),和

A[i_1, ..., i_p] == c(v_1[i_1], ..., v_p[i_p])
Run Code Online (Sandbox Code Playgroud)

对于所有有效的索引集(i_1,...,i_p).

例如:

> foo(list(LETTERS[1:2], c(3, 4, 5), letters[6:7]))
, , 1

               [,1]           [,2]           [,3]
[1,] c("A", 3, "f") c("A", 4, "f") c("A", 5, "f") …
Run Code Online (Sandbox Code Playgroud)

reduce r vectorization elementwise-operations

4
推荐指数
1
解决办法
177
查看次数

1D和2D阵列之间的元素比较

想要在1D和2D阵列之间执行元素明智的比较.需要将1D阵列的每个元素与相应的2D行进行比较(例如,更大),并且将创建掩模.这是一个例子:

A = np.random.choice(np.arange(0, 10), (4,100)).astype(np.float)
B = np.array([5., 4.,  8.,  2. ])
Run Code Online (Sandbox Code Playgroud)

我想要做

A<B 
Run Code Online (Sandbox Code Playgroud)

这样A的第一行将与B [0]进行比较,后者为5.结果将是一个布尔数组.

如果我试试这个我得到:

operands could not be broadcast together with shapes (4,100) (4,)
Run Code Online (Sandbox Code Playgroud)

有任何想法吗?

python arrays numpy elementwise-operations

4
推荐指数
1
解决办法
1307
查看次数

如何在特定索引处将两个数组相乘?

玩具示例

我有两个具有不同形状的数组,例如:

import numpy as np
matrix = np.arange(5*6*7*8).reshape(5, 6, 7, 8)
vector = np.arange(1, 20, 2)
Run Code Online (Sandbox Code Playgroud)

我想要做的是将矩阵的每个元素乘以“向量”的元素之一,然后在最后两个轴上求和。为此,我有一个与“矩阵”形状相同的数组,它告诉我要使用哪个索引,例如:

Idx = (matrix+np.random.randint(0, vector.size, size=matrix.shape))%vector.size
Run Code Online (Sandbox Code Playgroud)

我知道解决方案之一是:

matVec = vector[Idx]
res = np.sum(matrix*matVec, axis=(2, 3))
Run Code Online (Sandbox Code Playgroud)

甚至:

res = np.einsum('ijkl, ijkl -> ij', matrix, matVec)
Run Code Online (Sandbox Code Playgroud)

问题

然而,我的问题是我的数组很大,并且 matVec 的构建既需要时间又需要内存。那么有没有办法绕过这个并仍然达到相同的结果呢?

更现实的例子

这是我实际做的一个更现实的例子:

import numpy as np

order = 20
dim = 23

listOrder = np.arange(-order, order+1, 1)
N, P = np.meshgrid(listOrder, listOrder)
K = np.arange(-2*dim+1, 2*dim+1, 1)
X = np.arange(-2*dim, 2*dim, 1)

tN = np.einsum('..., …
Run Code Online (Sandbox Code Playgroud)

python arrays numpy matrix-multiplication elementwise-operations

4
推荐指数
1
解决办法
296
查看次数

元素矩阵乘法的并行化

我目前正在优化我的部分代码,因此执行一些基准测试.

我有NxN-matrices AT和想要的elementwise它们相乘并将结果保存在A再次,即A = A*T.由于此代码不可并行化,我将分配扩展为

!$OMP PARALLEL DO
do j = 1, N
    do i = 1, N
        A(i,j) = T(i,j) * A(i,j)
    end do
end do
!$OMP END PARALLEL DO
Run Code Online (Sandbox Code Playgroud)

(http://pastebin.com/RGpwp2KZ上的完整最小工作示例.)

现在发生的奇怪事情是,无论线程数量(1到4之间),执行时间大致保持不变(+ - 10%),而CPU时间随着线程数量的增加而增加.这让我觉得所有的线程都做同样的工作(因为我在OpenMP上犯了一个错误)因此需要相同的时间.

但是在另一台计算机上(有96个CPU内核可用),程序的行为与预期一致:随着线程数的增加,执行时间减少.令人惊讶的是,CPU时间也减少了(最多约10个线程,然后再次上升).

可能是有不同版本OpenMPgfortran已安装.如果这可能是原因,那么如果你能告诉我如何找到它就会很棒.

fortran openmp elementwise-operations

3
推荐指数
1
解决办法
1707
查看次数

Python:以另一列为条件的数据框中列表的元素均值

我有一个看起来像这样的数据框,它有三列(10 个不同的刺激、16 个试验和一个包含等长列表的数据列)。我只想根据刺激获得数据列的元素均值。由于我有 10 个不同的刺激,它应该为每个刺激产生 10 个数组,这也是试验中所有数据数组的平均值。

在此处输入图片说明

我想过这样的事情,但它给了我一些非常奇怪的东西。

df.groupby('stimulus').apply(np.mean)
>> IndexError: tuple index out of range
Run Code Online (Sandbox Code Playgroud)

在此处输入图片说明


构建我的数据框

trial_vec       = np.tile(np.arange(16)+1, 10)     
stimulus_vec    = np.repeat([-2., -1.75, -1., -0.75, -0.5,  0.5,  1.,  1.25,  1.75,  2.5 ], 16)                  
data_vec        = np.random.randint(0, 16, size=160)
df              = pd.DataFrame({'trial': trial_vec, 'stimulus': stimulus_vec, 'data': data_vec}).astype('object')
df["data"]      = [np.random.rand(4).tolist() for i in range(160)]
df
Run Code Online (Sandbox Code Playgroud)

python mean apply pandas elementwise-operations

3
推荐指数
1
解决办法
1606
查看次数

如何在 Juila 中逐元素执行 exp() 操作?

我是 Julia 的新手,这似乎是一个直接的操作,但出于某种原因,我在任何地方都找不到答案。

我一直在网上浏览一些教程,他们只是使用 exp(A) ,其中 A 是 nxm 矩阵,但这给了我一个 DimensionMismatch 错误。

我浏览了官方网站上基本函数线性代数部分的文档,并在谷歌上搜索了多次,但终生都找不到。

julia elementwise-operations

3
推荐指数
2
解决办法
941
查看次数

Julia 中的字典元素操作

我想向字典的所有值广播一个操作。对于数组,我知道我可以使用以下方法广播元素操作:

julia> b1 = [1, 2, 3]
julia> b1./2
3-element Array{Float64,1}:
 0.5
 1.0
 1.5
Run Code Online (Sandbox Code Playgroud)

将相同操作广播到字典的所有值的有效方法是什么?说,为了字典

a1 = Dict("A"=>1, "B"=>2)
Run Code Online (Sandbox Code Playgroud)

dictionary julia elementwise-operations

3
推荐指数
1
解决办法
438
查看次数