我正在使用Clojure中的一个应用程序,它需要繁殖大型矩阵,并且与相同的Numpy版本相比,遇到了一些大的性能问题.Numpy似乎能够在一秒钟内通过其转置乘以1,000,000x23矩阵,而等效的clojure代码需要超过六分钟.(我可以从Numpy打印出结果矩阵,所以它肯定会评估所有内容).
我在这个Clojure代码中做了哪些非常错误的事情?我可以尝试模仿Numpy的一些技巧吗?
这是python:
import numpy as np
def test_my_mult(n):
A = np.random.rand(n*23).reshape(n,23)
At = A.T
t0 = time.time()
res = np.dot(A.T, A)
print time.time() - t0
print np.shape(res)
return res
# Example (returns a 23x23 matrix):
# >>> results = test_my_mult(1000000)
#
# 0.906938076019
# (23, 23)
Run Code Online (Sandbox Code Playgroud)
和clojure:
(defn feature-vec [n]
(map (partial cons 1)
(for [x (range n)]
(take 22 (repeatedly rand)))))
(defn dot-product [x y]
(reduce + (map * x y)))
(defn transpose
"returns the transposition of a …Run Code Online (Sandbox Code Playgroud) 我需要在一个充满1和0的巨型文件中找到最大的1的平方.我知道我必须使用动态编程.我将它存储在2D数组中.任何有关找到最大方块的算法的帮助都会很棒,谢谢!
示例输入:
1 0 1 0 1 0
1 0 1 1 1 1
0 1 1 1 1 1
0 0 1 1 1 1
1 1 1 1 1 1
Run Code Online (Sandbox Code Playgroud)
回答:
1 1 1 1
1 1 1 1
1 1 1 1
1 1 1 1
Run Code Online (Sandbox Code Playgroud)
我的代码到目前为止:
int Square (Sq[int x][int y]) {
if (Sq[x][y]) == 0) {
return 0;
}
else {
return 1+MIN( Sq(X-1,Y), Sq(X,Y-1), Sq(X-1,Y-1) );
}
}
Run Code Online (Sandbox Code Playgroud)
(假设已经输入数组的值)
int main() {
int Sq[5][6]; …Run Code Online (Sandbox Code Playgroud) 我想用scipy 计算矩阵的数学等级.最明显的函数numpy.rank计算数组的维数(即标量有维度0,向量1,矩阵2等).我知道该numpy.linalg.lstsq模块具有此功能,但我想知道这样的基本操作是否内置于矩阵类中.
这是一个明确的例子:
from numpy import matrix, rank
A = matrix([[1,3,7],[2,8,3],[7,8,1]])
print rank(A)
Run Code Online (Sandbox Code Playgroud)
这给出2了维度,我正在寻找答案3.
我有一张桌子.
---------
| a | b |
---------
| a | b |
---------
Run Code Online (Sandbox Code Playgroud)
我想将它旋转45度(顺时针或逆时针)并将其保存到另一张桌子中.例如,如果我逆时针旋转45度,它将是:
-------------
| b | | |
-------------
| a | b | |
-------------
| a | | |
-------------
Run Code Online (Sandbox Code Playgroud)
另一个例子,当我旋转
-------------
| a | b | c |
-------------
| d | e | f |
-------------
| g | h | i |
-------------
Run Code Online (Sandbox Code Playgroud)
它将变为
---------------------
| c | | | | |
---------------------
| b | f | | | |
--------------------- …Run Code Online (Sandbox Code Playgroud) 目前我正在使用numpy来完成这项工作.但是,因为我正在处理具有数千行/列的矩阵,后来这个数字将达到数万,我想知道是否存在可以更快地执行此类计算的包?
我正在尝试使用csv文件的元素创建一个图,如下所示:
h1,h2,h3,h4
a,1,0,1,0
b,1,1,0,1
c,0,0,1,0
Run Code Online (Sandbox Code Playgroud)
我尝试了以下代码,但收到错误说
Error in data.frame(id = varieties, attr(mat, "row.names"), check.rows = FALSE) :
arguments imply differing number of rows: 8, 20
Run Code Online (Sandbox Code Playgroud)
我的示例数据有8列和20行(不包括标题和行名称).我尝试在线查找并尝试实施一些修复,但问题仍然存在.我真的很感激任何帮助.
mat <- read.csv("trial.csv", header=T, row.names=1)
varieties = names(mat)
df <- data.frame(id=varieties,attr(mat, "row.names"), check.rows= FALSE)
Run Code Online (Sandbox Code Playgroud) 在numpy中我可以做一个简单的矩阵乘法,如下所示:
a = numpy.arange(2*3).reshape(3,2)
b = numpy.arange(2).reshape(2,1)
print(a)
print(b)
print(a.dot(b))
Run Code Online (Sandbox Code Playgroud)
但是,当我使用PyTorch Tensors进行此操作时,这不起作用:
a = torch.Tensor([[1, 2, 3], [1, 2, 3]]).view(-1, 2)
b = torch.Tensor([[2, 1]]).view(2, -1)
print(a)
print(a.size())
print(b)
print(b.size())
print(torch.dot(a, b))
Run Code Online (Sandbox Code Playgroud)
此代码抛出以下错误:
RuntimeError:/Users/soumith/code/builder/wheel/pytorch-src/torch/lib/TH/generic/THTensorMath.c:503中的张量大小不一致
有关在PyTorch中如何进行矩阵乘法的任何想法?
我正在寻找一种在MATLAB中将大量可变数量的矩阵存储在数组中的方法.
有没有办法实现这个目标?
例:
for i: 1:unknown
myArray(i) = zeros(500,800);
end
Run Code Online (Sandbox Code Playgroud)
如果不知道数组的长度是多少,我可以根据需要修改附加信息.
更新:性能是我努力实现这一目标的主要原因.之前它曾将数据作为单个矩阵获取,实时显示,然后继续处理下一组数据.
我尝试使用多维数组,如下面Rocco所建议的那样,但是我的数据太大了以至于我用完了内存,我可能需要针对我的情况寻找另一种选择.当我尝试其他建议时会更新.
更新2:谢谢大家的建议,但是我应该预先指定,精度和速度都是这里的一个不可或缺的因素,在尝试三维数组并重新评估方法之前,我可能需要考虑回到原来的方法.用于导入数据.
我使用numpy中的dot()函数将3x3的矩阵与1x3的numpy.array相乘.输出例如是:
[[0.16666667 0.66666667 0.16666667]]
其类型:
<class 'numpy.matrixlib.defmatrix.matrix'>
Run Code Online (Sandbox Code Playgroud)
我该如何将其转换为列表.因为我知道结果将始终是1x3的矩阵所以它应该被转换为列表,因为我需要能够稍后循环它以计算其中两个列表的皮尔逊距离.
总结一下:如何从这个矩阵中制作一个列表?
我有一个8x8矩阵,像这样:
char matrix[8][8];
Run Code Online (Sandbox Code Playgroud)
另外,我有一个包含64个元素的数组,如下所示:
char array[64];
Run Code Online (Sandbox Code Playgroud)
然后我将矩阵绘制成一个表格,并用数字填充单元格,每个数字从左到右,从上到下递增.
如果我将索引3(列)和4(行)索引到矩阵中,我知道它对应于数组中位置35处的元素,因为它可以在我绘制的表格中看到.我相信有一些公式可以将矩阵的2个索引转换为数组的单个索引,但我无法弄清楚它是什么.
有任何想法吗?