我在 R 中有一个非常大且稀疏的矩阵,是使用“Matrix”包创建的,我想在 python + numpy 中处理。R 对象采用 csc 格式,如果我使用 Matrix 包中的 writeMM 函数将其导出,则输出如下所示:
%%MatrixMarket matrix coordinate real general
4589 17366 160441
22 1 5.954510725783322
36 1 29.77255362891661
41 1 23.81804290313329
74 1 5.954510725783322
116 1 59.54510725783322
127 1 11.909021451566645
159 1 17.863532177349967
Run Code Online (Sandbox Code Playgroud)
其中第一列是行,第二列是列,第三列是值。
我想知道如何将其导入到 python 中。我看到 scipy 有一个用于操作列压缩稀疏矩阵的模块,但它没有从文件创建稀疏矩阵的功能。
我正在尝试将 MATLAB 实现转换为 Python 3 实现。我发现了一个我不理解的函数 spdiags(),并且也不知道如何将它翻译成 Python 3。
有关该函数的 MATLAB 文档位于: http://www.mathworks.com/help/matlab/ref/spdiags.html
有关同名函数的 Scipy 文档位于: http://docs.scipy.org/doc/scipy/reference/ generated/scipy.sparse.spdiags.html
MATLAB 函数的作用是什么?是否有相同返回值的 Python 实现?
如何加速构造一个非常大的稀疏矩阵,其中每行只有一个非零元素对应于一列,并且每列有相同数量(平均)的非零元素?
N1我有一个大小为×的巨大(稀疏)矩阵N2,例如大小为1e8× 5e4,其中每一行仅包含一个非零元素,该元素是随机选择的,而不用 替换numpy.random.choice(numpy.arange(N2),size=N2,replace=False)。
据我所知,构建矩阵的唯一方法是循环numpy.random.choice()运行。由于非常大,为了加快速度,我正在使用:forN1N1scipy.weave
import numpy as np
from scipy import weave
from scipy.weave import converters
import scipy.sparse as sparse # Cython import
def weave_sparse(N1,N2,w):
conn_matrix = sparse.dok_matrix((N1,N2))
fac = lambda N : np.random.choice(np.arange(N), size=N, replace=False)[0]
code = """
int i;
py::tuple arg(1);
arg[0] = N2;
for(i=0;i<N1;i++) conn_matrix[i,(int) fac.call(arg)] = w;
"""
weave.inline(code,['conn_matrix','N1','N2', 'w', 'fac'],
compiler='gcc',extra_compile_args=['-std=c++11 -Ofast'],force=0)
return conn_matrix
Run Code Online (Sandbox Code Playgroud)
尽管如此,对于N1接近1e6和超越代码来说,它需要很长时间才能完成。我怀疑可能有一种更有效的方法来构建稀疏矩阵。还有其他策略可以在人类可读的时间内加速和构建矩阵吗?
如何获得稀疏复矩阵的逐元素绝对值?一般来说,是否可以使用用户定义的函数将一个矩阵映射到另一个矩阵?
我的原始数据集是针对药物不良反应的大量 JSON 对象列表。在每个 JSON 对象中,我们可以有几种以 rxcui id 形式给出不良反应的药物。
我获取了 JSON 对象列表并提取了我们需要的重要数据(例如该人是否死亡)和 rxcui,并将它们展平为最多 2 层深度的 JSON 对象。我们会有这样的东西:
{
"serious": 1,
"drug": [
"DrugA",
"DrugB",
"DrugC"
],
"rxcui": [
100,
200,
300
]
}
Run Code Online (Sandbox Code Playgroud)
我必须弄清楚如何将其放入一个数组中,以便将其提供给机器学习算法。所以我的想法是使用one-hot编码。
这就是我使用 countVectorizer 的原因,这样我就可以对所有这些子列表进行矢量化
我正在尝试连接几个 pandas 数据帧(有些是稀疏数据帧,有些是常规数据帧),它们是某些数据的 onehot 编码。我检查了所有文件(我还将它们腌制到硬盘上),没有一个文件大于 81MB。但一旦我开始将它们连接起来,它们就会膨胀到超过 29 GB。这怎么可能?
我所有的 df 看起来都是这样的:
Label0 Label1 Label2 Label3... Label999
1 1 0 0 ... 0
1 1 0 1 ... 1
.
.
.
Run Code Online (Sandbox Code Playgroud)
我像这样运行 concat:
x = pandas.concat([x, drugcharacterization, occurcountry, reactionmeddrapt, reactionmeddraversionpt, reactionoutcome, rxcui],axis=1, copy=False)
Run Code Online (Sandbox Code Playgroud)
我还可以将我尝试在内存中轻松连接的所有子数据帧放入其中。一旦我这样做,它会爆炸的原因是什么? …
我需要通过 http 和 JSON 在多个服务器到服务器的通信中发送一些巨大的矩阵(全是 0)。
我正在Python 3.x中使用 numpy 和 scipy。
有没有标准的工具方法可以做到这一点?
我想我可以发送索引,并以某种方式在第二个服务器中重建矩阵以获得完整的矩阵,但我想避免使用自定义代码来重新发明轮子。
先感谢您。
我正在尝试使用 R 中的 %*% 函数将矩阵(由少数 1 和大部分 O 组成)与向量相乘,此过程需要大量时间。有什么办法可以让它更快吗?
谢谢
我想在 python 中生成给定形状的随机稀疏埃尔米特矩阵。我怎样才能高效地做到这一点?有没有内置的Python函数可以完成这个任务?
我已经找到了随机稀疏矩阵的解决方案,但我也希望该矩阵是厄米特矩阵。这是我找到的随机稀疏矩阵的解决方案
import numpy as np
import scipy.stats as stats
import scipy.sparse as sparse
import matplotlib.pyplot as plt
np.random.seed((3,14159))
def sprandsym(n, density):
rvs = stats.norm().rvs
X = sparse.random(n, n, density=density, data_rvs=rvs)
upper_X = sparse.triu(X)
result = upper_X + upper_X.T - sparse.diags(X.diagonal())
return result
M = sprandsym(5000, 0.01)
print(repr(M))
# <5000x5000 sparse matrix of type '<class 'numpy.float64'>'
# with 249909 stored elements in Compressed Sparse Row format>
# check that the matrix is symmetric. The difference should …Run Code Online (Sandbox Code Playgroud) 我想针对大型语料库运行 textrank(仅我的开发环境使用 17K 句子)
因此我使用了 scipy dok_matrix。然而,当将第一个值分配给我的稀疏矩阵(即similarity_matrix[1][0])时,尽管在 pycharm 调试中看到我的 dok_matrix 的大小为 17K x 17k,但我收到以下错误。
IndexError: row index (1) out of range
我做错了什么?
def _score_generator(self, sentences, sentence_vectors):
sentence_count = len(sentences)
similarity_matrix = dok_matrix((sentence_count, sentence_count), dtype=np.float32)
for i in range(len(sentences)):
for j in range(len(sentences)):
if i != j:
similarity_matrix[i][j] = cosine_similarity(sentence_vectors[i].reshape(1, 100), sentence_vectors[j].reshape(1, 100))[0, 0]
nx_graph = nx.from_scipy_sparse_matrix(similarity_matrix)
scores = nx.pagerank(nx_graph)
return scores
Run Code Online (Sandbox Code Playgroud) 我看过Matrix包和他们的幻灯片。我试图理解课堂上争论背后的直觉和含义是什么dgCMatrix。我明白那个
@i给出矩阵中非零条目的从零开始的行索引.@j给出矩阵中非零条目的从零开始的列索引.@x给出该位置处的非零元素(i,j)。但是我不明白指针的含义@p。文档说
\n\n\n数字(整数值)指针向量,每一列(或行)一个,指向列(或行)中元素的初始(从零开始)索引。
\n
这信息不是很丰富。在同一页面的“详细信息”部分中,他们解释了更多信息
\n\n\n\n\n如果缺少
\nior ,则必须是第一个元素为零的非递减整数向量。它提供行或列索引的压缩表示或 \xe2\x80\x9cpointer\xe2\x80\x9d 表示(以缺失者为准)。的扩展形式,其中, 用作(从 1 开始的)行或列索引。jpprep(seq_along(dp),dp)dp <- diff(p)
这对我来说绝对是不直观的。有人可以简单解释一下p代表什么吗?我已经创建了一个最小工作示例,但请随意创建一个新示例。
# Define non-zero values and their row/col indeces\ni_indeces <- c(1, 3, 4, 6, 8, 9)\nj_indeces <- c(2, 9, 6, 3, 9, 10)\nvalues …Run Code Online (Sandbox Code Playgroud)