我最近在 MATLAB R2022a 中偶然发现了以下行为:
>> a = sparse(1,2,1)
a =
(1,2) 1
>> b = sparse(2,1,18)
b =
(2,1) 18
>> a+b
ans =
(2,1) 18
(1,2) 1
(2,2) 19
Run Code Online (Sandbox Code Playgroud)
值为 19 的 (2,2) 元素的存在非常令人费解。直觉上,我预计会得到零(无元素)或错误,表明向量的大小不兼容。我在文档中找不到此行为的解释。
那么,这是一个错误还是一个功能?
我正在尝试利用NumPy 广播和后端数组计算来显着加快此功能。不幸的是,它不能很好地扩展,所以我希望大大提高它的性能。现在代码没有正确利用广播进行计算。
我使用WGCNA 的 bicor 函数作为黄金标准,因为这是我目前所知道的最快的实现。Python 版本输出与 R 函数相同的结果。
# ==============================================================================
# Imports
# ==============================================================================
# Built-ins
import os, sys, time, multiprocessing
# 3rd party
import numpy as np
import pandas as pd
# ==============================================================================
# R Imports
# ==============================================================================
from rpy2 import robjects, rinterface
from rpy2.robjects.packages import importr
from rpy2.robjects import pandas2ri
pandas2ri.activate()
R = robjects.r
NULL = robjects.rinterface.NULL
rinterface.set_writeconsole_regular(None)
WGCNA = importr("WGCNA")
# Python
def _biweight_midcorrelation(a, b):
a_median = np.median(a)
b_median = np.median(b)
# …Run Code Online (Sandbox Code Playgroud) 我有以下两个 PyTorch 张量 A 和 B。
A = torch.tensor(np.array([40, 42, 38]), dtype = torch.float64)
tensor([40., 42., 38.], dtype=torch.float64)
Run Code Online (Sandbox Code Playgroud)
B = torch.tensor(np.array([[[1,2,3,4,5],[1,2,3,4,5],[1,2,3,4,5],[1,2,3,4,5],[1,2,3,4,5]], [[4,5,6,7,8],[4,5,6,7,8],[4,5,6,7,8],[4,5,6,7,8],[4,5,6,7,8]], [[7,8,9,10,11],[7,8,9,10,11],[7,8,9,10,11],[7,8,9,10,11],[7,8,9,10,11]]]), dtype = torch.float64)
tensor([[[ 1., 2., 3., 4., 5.],
[ 1., 2., 3., 4., 5.],
[ 1., 2., 3., 4., 5.],
[ 1., 2., 3., 4., 5.],
[ 1., 2., 3., 4., 5.]],
[[ 4., 5., 6., 7., 8.],
[ 4., 5., 6., 7., 8.],
[ 4., 5., 6., 7., 8.],
[ 4., 5., 6., 7., 8.], …Run Code Online (Sandbox Code Playgroud) python shapes matrix-multiplication pytorch array-broadcasting
我有一个数组,例如arr = [1, 2, 3, 4]、 和m = 3。我想制作一个包含m行的矩阵,重复该数组。该示例的输出将是
[[1, 2, 3, 4],
[1, 2, 3, 4],
[1, 2, 3, 4]]
Run Code Online (Sandbox Code Playgroud)
我怎样才能做到这一点?我尝试过
np.vstack((arr, arr, arr))
Run Code Online (Sandbox Code Playgroud)
然而,据我了解,这只有在我有效地硬核时才有效m。
从 Numpy nd 数组开始:
>>> arr
[
[
[10, 4, 5, 6, 7],
[11, 1, 2, 3, 4],
[11, 5, 6, 7, 8]
],
[
[12, 4, 5, 6, 7],
[12, 1, 2, 3, 4],
[12, 5, 6, 7, 8]
],
[
[15, 4, 5, 6, 7],
[15, 1, 2, 3, 4],
[15, 5, 6, 7, 8]
],
[
[13, 4, 5, 6, 7],
[13, 1, 2, 3, 4],
[14, 5, 6, 7, 8]
],
[
[10, 4, 5, 6, …Run Code Online (Sandbox Code Playgroud) 我有一个 numpy 数组格式的图像,我编写了假设 rgb 图像作为输入的代码,但我发现输入由黑白图像组成。
对于什么应该是 RGB 即 (256,256,3) 维图像,我将输入作为灰度 (256,256) 数组图像,我想将其转换为 (256,256,3)
这是我在 numpy 数组中的内容:
[[0 0 0 ... 0 0 0]
[0 0 0 ... 0 0 0]
[0 0 0 ... 0 0 0]
...
[0 0 0 ... 0 0 0]
[0 0 0 ... 0 0 0]
[0 0 0 ... 0 0 0]]
(256, 256)
Run Code Online (Sandbox Code Playgroud)
这就是我想要的:(对于上面数组中的每个值,相同元素的数组 3 次)
[[[0. 0. 0.]
[0. 0. 0.]
[0. 0. 0.]
...
[0. 0. 0.]
[0. 0. 0.] …Run Code Online (Sandbox Code Playgroud) 我读了答案 “什么是 Julia 相当于 numpy 的 where 函数?”。,但还没有看到答案 (ifelse) 如何为用户提供 numpy.where 的所有功能。我在下面发布了示例代码:
A = [0.0 0.9 0.0 0.99 0.0]
a = 1:长度(A)
#-v- 按预期产生 [0 1.0 0 1.0 0],但如何获取索引值?
b = ifelse.(A .- 1.0 .> -1.0, 1.0, 0 )
#-^- 如何得到数组[0.9 0.99]?如何从数组中删除所有零?
除了使用 for 循环之外的任何解决方法将不胜感激。
有没有一种方法,以增加在单个操作(而不是总和)多个阵列在一起吗?显然,np.sum并且np.add是不同的操作,但是,我现在正在努力解决的问题是np.add一次只需要两个数组。我可以利用
output = 0
for arr in arr_list:
output = output + array
Run Code Online (Sandbox Code Playgroud)
或者
output = 0
for arr in arr_list:
output = np.add(output, array)
Run Code Online (Sandbox Code Playgroud)
是的,这是可行的。但是,如果我可以简单地做一些变体就好了
output = np.add_multiple(arr_list)
Run Code Online (Sandbox Code Playgroud)
这存在吗?
编辑:我最初没有说清楚。我特别要求,它的功能不要求一个阵列被构建阵列,如我的数组相等尺寸的不和要求的广播,例如:
a = np.arange(3).reshape(1,3)
b = np.arange(9).reshape(3,3)
a, b = a[:,:,None,None], b[None,None,:,:]
Run Code Online (Sandbox Code Playgroud)
这些工作:
a + b # Works
np.add(a, b) # Works
Run Code Online (Sandbox Code Playgroud)
这些没有,并以相同的例外失败:
np.sum([a, b], axis = 0)
np.add.reduce([a, b])
Traceback (most recent call last):
File …Run Code Online (Sandbox Code Playgroud) 我想在满足某个条件的矩阵的每一行中找到第一个值的索引。我想弄清楚如何在不使用数组推导式的情况下做到这一点。
这就是我将如何使用数组理解来做到这一点:
# let's say we want to find the first column index, per row, where a number in that row is below some threshold.
threshold = 0.5;
data = randn(50,100);
first_threshold_crossings = [findfirst(data[i,:]<threshold) for i in 1:size(data,1)];
Run Code Online (Sandbox Code Playgroud)
生成一个索引列表,告诉您每行的位置(按列)从左到右首先下降到阈值以下的值。
你能想象这样做的任何更快的方法吗?
broadcast multidimensional-array logical-operators julia array-broadcasting