+关注
已关注

分类  

暂无分类

标签  

暂无标签

日期归档  

暂无数据

有没有办法镜像数据矩阵然后转换为x,y坐标数组?

发布于2021-04-12 14:53     阅读(997)     评论(0)     点赞(1)     收藏(3)


0

1

2

3

4

5

6

7

8

9

我试图获取一个数据点矩阵,其中第2列中的值始终> =第1列中的值,因此创建了一个三角形数组。我需要创建一个正方形数组,其中数据跨对角线镜像。例如,[1,3]和[3,1]处的值将相同。我有一个三列矩阵,其中第一列是X坐标,第二列是Y坐标,第三列是一个特定值,如下所示:

1  1  1.5
1  2  2.3
1  3  3.3
2  2  5.6
2  3  2.1
3  3  1.0
3  4  0.7
3  5  4.1
3  6  2.9

第1列和第2列中有缺失值,因此在我镜像矩阵并合并以便获得所需数据的平方数组之后,我用0填充缺失索引。首先,脚本获取了“每百万计数”值对于第三列中的每个值。我已经看到了某些方面的一些变化,但是没有任何东西可以满足我的需求。

with open(args.matrix, 'r') as mtx:
    df = pd.read_csv(mtx, sep='\t', lineterminator='\n', header=None)
    num = df[2].sum(axis=0)
    df[2] = (df[2]/num)*1000000
    df[0] = df[0]-1
    df[1] = df[1]-1
    df2 = df[[1,0,2]].rename({1:0, 0:1}, axis='columns')
    df2 = df2[df2[0] != df2[1]]
    df = pd.concat([df,df2]).sort_values([0,1], ascending=[True,True], ignore_index=True)
    df = df.pivot(index=1, columns=0, values=2).fillna(0).reindex(index=range(1,num), columns=range(1,num), fill_value=0)

该脚本可以工作,但是有没有更快,更优雅的方法来执行此任务?我不确定我是否解释得足够好,所以请让我知道是否有任何不清楚的地方。


解决方案


感谢您的评论和建议。我最终要做的是遍历输入矩阵以创建数组,然后执行“每百万计数”计算。我知道迭代数组/数据框不是一个好习惯,因此我不想在转换为数据框并执行计算后进行迭代。但是,我认为在创建数组之前进行迭代可能会更好/更快。它做到了。这是我更新的脚本(为简单起见,我只输入num = 2500;此脚本之前有一个函数):

num = 2500
mat = np.zeros((num,num))
with open(args.matrix, 'r') as mtx:
    for i in csv.reader(mtx, delimiter="\t"):
        mat[int(i[0])-1][int(i[1])-1] = i[2]
        mat[int(i[1])-1][int(i[0])-1] = i[2]
    reads = np.sum(mat)
    mat = mat/(reads*0.000001)

正如我在评论中提到的那样,我正在尝试使运行速度尽可能快。我使用的矩阵通常长为数万行,因此数组的最小长度为2000 x 2000,而我一次要处理几行。如果有人对减少运行时间有任何建议,请告诉我。

0

1

2

3

4

5

6



所属网站分类: 技术文章 > 问答

作者:黑洞官方问答小能手

链接: https://www.pythonheidong.com/blog/article/936028/a728357bf58f87a07702/

来源: python黑洞网

任何形式的转载都请注明出处,如有侵权 一经发现 必将追究其法律责任

1 0
收藏该文
已收藏

评论内容:(最多支持255个字符)