天道酬勤,学无止境

Transpose matrix: swapping elements doesn't alter values

I am trying to transpose a matrix built with vectors.

Here is the transpose function I wrote:

void transpose(std::vector<std::vector<int>>& fill_mat) {
    for (int i = 0; i < fill_mat.size(); ++i) {
        for (int j = 0; j < fill_mat.size(); ++j) {
            std::swap(fill_mat[i][j], fill_mat[j][i]);
        }
    }
}

It doesn't seem to be doing anything: my final results are the same as the starting ones.


Here is my full program:

#include<iostream>
#include<vector>
#include<utility>

void print_matrix(std::vector<std::vector<int>>& to_print) {
    for (int i = 0; i < to_print.size(); ++i) {
        for (int j = 0; j < to_print.size(); ++j) {
            std::cout << " " << to_print[i][j];
        }
        std::cout << std::endl;
    }
}

void make_matrix(std::vector<std::vector<int>>& fill_mat) {
    for (int i = 0; i < fill_mat.size(); ++i) {
        for (int j = 0; j < fill_mat.size(); ++j) {
            fill_mat[i][j] = rand() % 15;
        }
    }
}

void transpose(std::vector<std::vector<int>>& fill_mat) {
    for (int i = 0; i < fill_mat.size(); ++i) {
        for (int j = 0; j < fill_mat.size(); ++j) {
            std::swap(fill_mat[i][j], fill_mat[j][i]);
        }
    }
}


int main() {
    int size = 3;
    std::vector<std::vector<int>> matrix_sample(size, std::vector<int>(size));

    make_matrix(matrix_sample);
    print_matrix(matrix_sample);

    transpose(matrix_sample);

    std::cout << "----## transpose ##-----" << std::endl;
    print_matrix(matrix_sample);
}

I expected to print out the transposed matrix but the input ends up being the same as the output. What am I doing wrong?

标签

评论

You swap (i,j) with (j,i) twice! That's why it has no effect.

You should only work on one half of your matrix. Plus minors improvements, we get:

void transpose(std::vector<std::vector<int>>& fill_mat)
{
    using size_type = decltype(fill_mat)::size_type; // better use your matrix' size type
    for (size_type i = 0; i < fill_mat.size(); ++i) {
        for (size_type j = 0; j < i; ++j) {
            using std::swap; // see swap idiom
            swap(fill_mat[i][j], fill_mat[j][i]);
        }
    }
}

受限制的 HTML

  • 允许的HTML标签:<a href hreflang> <em> <strong> <cite> <blockquote cite> <code> <ul type> <ol start type> <li> <dl> <dt> <dd> <h2 id> <h3 id> <h4 id> <h5 id> <h6 id>
  • 自动断行和分段。
  • 网页和电子邮件地址自动转换为链接。

相关推荐
  • 转置矩阵存储在一维数组中而不使用额外的内存[重复](Transpose matrix stored in a 1-dimensional array without using extra memory [duplicate])
    问题 这个问题在这里已经有了答案: 8 年前关闭。 可能的重复: 矩阵的就地转置 最近参加了技术书面面试。 通过以下问题。 我有一个数组说 testArray = {a1,a2,a3,...an,b1,b2,b3,....bn,c1,c2,c3,.....,cn} 我需要将此数组排序为` testArray = {a1,b1,c1,a2,b2,c2,a3,b3,c3,.....,an,bn,cn} 约束是我不应该使用额外的内存,不应该使用任何内置函数。 应该编写完整的代码,它可以是任何语言,也可以使用任何数据结构。 例如: Input: {1,2,3,4,5,6,7,8,9}, n = 3 Output: {1,4,7,2,5,8,3,6,9} 我无法在约束范围内获得任何解决方案,任何人都可以提供解决方案或建议吗? 回答1 这只是一个矩阵转置操作。 甚至在维基百科上还有一个关于原位矩阵转置的问题和解决方案。 没有额外的空间是不可能的,因为您至少需要遍历数组。 O(1)额外的内存是可能的,对时间复杂度有很大的损失。 该解决方案建立在维基百科页面中的follow-the-cycle算法之上:对于每个单元格,我们将找到循环中索引最小的单元格。 如果索引最小的单元格大于或等于(>=)当前单元格的索引,我们将进行链交换。 否则,我们忽略该单元格,因为它已正确交换。 (粗略分析的
  • Why is transposing a matrix of 512x512 much slower than transposing a matrix of 513x513?
    After conducting some experiments on square matrices of different sizes, a pattern came up. Invariably, transposing a matrix of size 2^n is slower than transposing one of size 2^n+1. For small values of n, the difference is not major. Big differences occur however over a value of 512. (at least for me) Disclaimer: I know the function doesn't actually transpose the matrix because of the double swap of elements, but it makes no difference. Follows the code: #define SAMPLES 1000 #define MATSIZE 512 #include <time.h> #include <iostream> int mat[MATSIZE][MATSIZE]; void transpose() { for ( int i = 0
  • 如何转置多维数组到位(Howto transpose multidimensional array in place)
    问题 如何将二维矩阵转置到位? 回答1 维基百科有一篇文章In-place matrix transposition。 这篇文章涵盖了非方阵。 http://en.wikipedia.org/wiki/In-place_matrix_transposition 回答2 for (int i=0; i<n; i++) { for (int j=0; j<i; j++) { temp = a[i][j]; a[i][j] = a[j][i]; a[j][i] = temp; } } 回答3 您还没有指定语言,但一般来说,您要做的是: let a be your array. for each i,j with i<j switch a[i,j] with a[j,i] 回答4 要获得方阵的转置,我们需要考虑主对角线上方或下方的元素,并将每个元素与其沿主对角线的反射交换: for i->0 to N-1 for j->i+1 to N-1 swap matrix[i][j] with matrix[j][i] 回答5 for(i=0;i<N;i++) for(j=0;j<N;j++) if(i!=j && j>i) { temp=a[i][j]; a[i][j]=a[j][i]; a[j][i]=temp; } ( N是数组的大小) 回答6 何苦 ? 只需在任何访问语句中交换索引。
  • 如何将PHP中的2D数组旋转90度(How can I rotate a 2d array in php by 90 degrees)
    问题 我想将矩阵顺时针旋转90度。 这等于使输入中的第一列成为输出的第一行,使输入中的第二列成为输出的第二行,并且使输入中的第三列成为输出的第三行。 请注意,由于旋转了90度,因此列的底部=行的开头。 例如: $matrix= [[1, 2, 3] [4, 5, 6], [7, 8, 9]]; rotate90degrees($matrix)= [[7, 4, 1], [8, 5, 2], [9, 6, 3]] 我所知道的是,我首先要转置矩阵,然后交换列以将矩阵旋转90度。 如何将其应用于php? 回答1 在不添加某种线性代数库的情况下,php没有矩阵的“转置”之类的概念。 您可以通过遍历矩阵并交换一些索引来本地完成此操作 <?php function rotate90($mat) { $height = count($mat); $width = count($mat[0]); $mat90 = array(); for ($i = 0; $i < $width; $i++) { for ($j = 0; $j < $height; $j++) { $mat90[$height - $i - 1][$j] = $mat[$height - $j - 1][$i]; } } return $mat90; } $mat = [[1, 2, 3], [4, 5, 6], [7, 8
  • Python:如何转置矩阵的一部分(Python: how to transpose part of matrix)
    问题 如果我有这样的矩阵: matrix = [[1, 2, 3, 4], [5, 6, 7, 8], [9, 10, 11, 12], [13, 14, 15, 16]] 我怎么能得到这个: matrix = [[1, 2, 3, 4], [5, 6, 10, 14], [9, 7, 11, 15], [13, 8, 12, 16]] 也就是说,如何排除第一行和第一列并转置其余部分? 我试过了,它使矩阵保持不变: for i in range(1, 4): for j in range(1, 4): temp = copy.deepcopy(matrix[i][j]) matrix[i][j] = matrix[j][i] matrix[j][i] = temp 当我尝试时: new_matrix = list(matrix) for i in range(1, 4): for j in range(1, 4): matrix[i][j] = new_matrix[j][i] matrix[j][i] = new_matrix[i][j] 我明白了: [[1, 2, 3, 4], [5, 6, 10, 14], [9, 10, 11, 15], [13, 14, 15, 16]] 我想将它转置到主要和次要对角线上。 回答1 学习 numpy,即使对于这个简单的任务也是值得的。
  • 三阶矩阵转置(Java)
    矩阵的转置是矩阵的基本操作之一,使用程序设计语言实现该操作也很简单。关键是其中的一点小技巧。 矩阵的转置并不需要对所有的元素进行操作,只需对主对角线以上或以下(不包括对角线)的元素操作即可。因此只需要对换n*(n-1)/2个元素,时间复杂度为O(n^2) 其中两个变量交换数值的操作,我们不采用设置中间变量的方法,这样会多申请一个空间。 变量a=1与变量b=2交换数值可以这么进行: a = a - b; b = b + a; a = b - a; 很轻易就可以推出结果 那么程序如下: 对该三阶矩阵主对角线以下的3个元素进行对换操作 public static void main(String[] args) { // TODO Auto-generated method stub int[][] matrix = {{1, 2, 3}, {2, 2, 1}, {3, 4, 3}}; //先输出原矩阵 System.out.println("原矩阵是:"); for (int i = 0; i < matrix.length; i++) { for (int j = 0; j < matrix.length; j++) { System.out.print(matrix[i][j]+" "); } System.out.println(); } //转置操作 for (int i =
  • 如何旋转二维数组?(How do you rotate a two dimensional array?)
    问题 受雷蒙德·陈(Raymond Chen)的启发,假设您有一个4x4二维数组,请编写一个将其旋转90度的函数。 雷蒙德(Raymond)链接到伪代码的解决方案,但我希望看到一些真实世界的东西。 [1][2][3][4] [5][6][7][8] [9][0][1][2] [3][4][5][6] 成为: [3][9][5][1] [4][0][6][2] [5][1][7][3] [6][2][8][4] 更新:尼克的答案是最直接的,但是有没有办法比n ^ 2更好呢? 如果矩阵是10000x10000,该怎么办? 回答1 这是在C#中 int[,] array = new int[4,4] { { 1,2,3,4 }, { 5,6,7,8 }, { 9,0,1,2 }, { 3,4,5,6 } }; int[,] rotated = RotateMatrix(array, 4); static int[,] RotateMatrix(int[,] matrix, int n) { int[,] ret = new int[n, n]; for (int i = 0; i < n; ++i) { for (int j = 0; j < n; ++j) { ret[i, j] = matrix[n - j - 1, i]; } } return ret; } 回答2 O(n ^ 2
  • 线性代数学习笔记——行列式
    1.引出 通过解二元一次方程组,引出二阶行列式,类比得三阶…n阶。 2.定义 n阶行列式  ①排列  由n个自然数1,2,…,n按一定次序排成一列所得的n元数串i1,i2,…in称为一个n级排列  ②逆序数  在n级排列i1,i2,…in中,排在第k个数ik前面但比数ik大的数的个数称为ik在这个排列中的逆序数  ③奇偶排列  逆序数为奇数的排列为奇排列,逆序数为偶数的排列为偶排列  在所有n级排列中,只有排列1,2,…,n的逆序数为零,我们称1,2,…,n为自然排列,显然自然排列为偶排列  ④对换  将一个排列中的两个元素互换位置,其余元素位置保持不变,这种由给定排列得到新的排列的操作称为对换。  如果对换的两个元素在排列中处于相邻位置上,则称这样的对换为相邻对换。  ⑤行列式的转置 设 D = ∣ a 11 a 12 ⋯ a 1 n a 21 a 22 ⋯ a 2 n ⋮ ⋮ ⋮ ⋮ a n 1 a n 2 ⋯ a n n ∣ , D ′ = ∣ a 11 a 21 ⋯ a n 1 a 12 a 22 ⋯ a n 2 ⋮ ⋮ ⋮ ⋮ a 1 n a 2 n ⋯ a n n ∣ (1) D = \left| \begin{matrix} a_{11} & a_{12} &\cdots & a_{1n} \\ a_{21} & a_{22} &\cdots & a_{2n} \\
  • NO.2 转置矩阵
    给定一个二维整数数组 matrix, 返回 matrix 的转置矩阵 。 转置矩阵 如果矩阵为 m 行 n 列,则转置后的矩阵为 n 行 m 列,且对任意和,都有 创建一个 n 行 m 列的新矩阵,根据转置的规则对新矩阵中的每个元素赋值,则新矩阵为转置后的矩阵。 解题思路 转置矩阵也是将M行N列的矩阵的主对角线翻转,交换矩阵的行索引与列索引,转成N行M列的矩阵,原矩阵中matrix[i][j]的位置,会交换到新矩阵的newMatrix[j][i]的位置。如下图示: 示例 示例 1: 输入:matrix = [[1,2,3],[4,5,6],[7,8,9]] 输出:[[1,4,7],[2,5,8],[3,6,9]] 示例 2: 输入:matrix = [[1,2,3],[4,5,6]] 输出:[[1,4],[2,5],[3,6]] 提示: m == matrix.length n == matrix[i].length 1 <= m, n <= 1000 1 <= m * n <= 105 -109 <= matrix[i][j] <= 109 Solution DEMO class Solution { public int[][] transpose(int[][] matrix) { int[][] arrays = new int[matrix[0].length]
  • 如何将 N x N 矩阵旋转 90 度? [关闭](How to rotate a N x N matrix by 90 degrees? [closed])
    问题 关闭。 这个问题需要更加集中。 它目前不接受答案。 想改善这个问题吗? 更新问题,使其仅通过编辑这篇文章来关注一个问题。 6年前关闭。 改进这个问题 如何将 N x N 矩阵旋转 90 度。 我希望它就位? 回答1 for(int i=0; i<n/2; i++) for(int j=0; j<(n+1)/2; j++) cyclic_roll(m[i][j], m[n-1-j][i], m[n-1-i][n-1-j], m[j][n-1-i]); void cyclic_roll(int &a, int &b, int &c, int &d) { int temp = a; a = b; b = c; c = d; d = temp; } 请注意,我还没有对此进行测试,只是在现场进行了组合。 请在对它进行任何操作之前进行测试。 回答2 这是我的解决方案:(顺时针旋转 pi/2) 做数组的转置,(如矩阵转置) 反转每一行的元素cons int row = 10; cons int col = 10; //transpose for(int r = 0; r < row; r++) { for(int c = r; c < col; c++) { swap(Array[r][c], Array[c][r]); } } //reverse elements on row
  • 用javascript中的矩阵的列交换(换位)行(Swap rows with columns (transposition) of a matrix in javascript [duplicate])
    问题 这个问题已经在这里有了答案: 用JavaScript转置2D数组(23个答案) 3年前关闭。 例如,我有一个像这样的矩阵: |1 2 3| |4 5 6| |7 8 9| 我需要将其转换成这样的矩阵: |1 4 7| |2 5 8| |3 6 9| 实现这个目标的最佳和最佳方法是什么? 回答1 请参阅文章:在JavaScript和jQuery中转置数组 function transpose(a) { // Calculate the width and height of the Array var w = a.length || 0; var h = a[0] instanceof Array ? a[0].length : 0; // In case it is a zero matrix, no transpose routine needed. if(h === 0 || w === 0) { return []; } /** * @var {Number} i Counter * @var {Number} j Counter * @var {Array} t Transposed data is stored in this array. */ var i, j, t = []; // Loop through every item in the outer
  • 在 Haskell 中获取矩阵的所有对角线(Getting all the diagonals of a matrix in Haskell)
    问题 二维列表如下所示: 1 | 2 | 3 - - - - - 4 | 5 | 6 - - - - - 7 | 8 | 9 或者在纯haskell中 [ [1,2,3], [4,5,6], [7,8,9] ] diagonals [ [1,2,3], [4,5,6], [7,8,9] ]的预期输出是 [ [1], [4, 2], [7, 5, 3], [8, 6], [9] ] 编写allDiagonals (包括反对角线)是微不足道的: allDiagonals :: [[a]] -> [[a]] allDiagonals xss = (diagonals xss) ++ (diagonals (rotate90 xss)) 我对这个问题的研究 StackOverflow 上的类似问题 Python 这个问题是关于 Python 中的同一个问题,但是 Python 和 Haskell 非常不同,所以该问题的答案与我无关。 只有一个 这个问题和答案在 Haskell 中,但仅关于中心对角线。 胡歌 搜索[[a]] -> [[a]]没有给我任何有趣的结果。 独立思考 我认为索引遵循基数 x 中的一种计数,其中 x 是矩阵中的维数,请看: 1 | 2 - - - 3 | 4 对角线是[ [1], [3, 2], [4] ] 1可以在matrix[0][0] 3可以在matrix[1]
  • 数组的就地排列遵循此规则(in-place permutation of a array follows this rule)
    问题 假设有一个数组,我们想在奇数索引(索引从0开始)中查找所有内容,并将其移到末尾。 偶数索引中的所有内容都将其移到开头。 保留所有奇数索引项和所有偶数索引项的相对顺序。 即如果数组是 a1 b1 a2 b2 ... an bn 手术后它变成 a1 a2 a3 ... an b1 b2 ... bn 可以在原地和O(n)时间内完成吗? 回答1 可以,但是非常复杂! 在缓存方面,更简单的O(nlogn)和O(1)空间解决方案可能更好。 我们将解决与您的问题不同的问题,但是一旦我们解决了您的问题,这个问题就变得微不足道了。 考虑数组为 b1, a1, b2, a2, ..., bn, an 而你必须将其转换为 a1, a2, ..., an, b1, b2, ..., bn 使用索引1到2n, 我们看到这是由 i -> (n+1)*i (mod 2n+1). O(nlogn)时间O(1)空间解 我们可以如下使用分而治之。 首先对于接近n / 2的m进行转换 b1, a1, ..., bn , an 至 a1,a2,...am, b1,b2, ..bm, a(m+1), ..., an, b(m+1), ... , bn 递归地应用到前2m个元素,然后再应用其余元素。 现在我们需要做的是将中间数组循环移位m个点(这可以在O(n)时间和O(1)空间中完成) 给 a1, a2,
  • 如何交换数组元素以将数组从类似列的表示形式转换为类似行的表示形式(how to swap array-elements to transfer the array from a column-like into a row-like representation)
    问题 例如:数组 a1, a2, a3, b1, b2, b3, c1, c2, c3, d1, d2, d3 代表下表 a1, b1, c1, d1 a2, b2, c2, d2 a3, b3, c3, d3 现在我想把数组变成以下形式 a1, b1, c1, d1, a2, b2, c2, d2, a3, b3, c3, d3 是否存在一种算法,它将数组(来自第一种形式)和表的维度作为输入参数并将数组转换为第二种形式? 我认为一种不需要分配额外内存的算法,相反,我认为应该可以通过元素交换操作来完成这项工作。 回答1 您正在寻找的术语是就地矩阵 transpose ,这是一个实现。 回答2 维基百科专门写了一篇文章来介绍这个过程,它叫做 In-place Matrix Transposition。 http://en.wikipedia.org/wiki/In-place_matrix_transposition 回答3 这只不过是一个就地矩阵转置。 一些伪代码: for n = 0 to N - 2 for m = n + 1 to N - 1 swap A(n,m) with A(m,n) 如您所见,您需要 2 个索引来访问一个元素。 这可以通过将(n,m)为nP+m来完成,其中P是列数。 回答4 何苦? 如果它们排列在一维数组中,并且您知道逻辑行/跨度中有多少个元素
  • 高速缓存有效的矩阵转置程序?(A Cache Efficient Matrix Transpose Program?)
    问题 因此,转置矩阵的明显方法是使用: for( int i = 0; i < n; i++ ) for( int j = 0; j < n; j++ ) destination[j+i*n] = source[i+j*n]; 但是我想要一些可以利用局部性和缓存阻止功能的东西。 我一直在查找它,找不到能够做到这一点的代码,但是我被告知这应该是对原始内容的非常简单的修改。 有任何想法吗? 编辑:我有一个2000x2000矩阵,我想知道如何使用两个for循环来更改代码,基本上将矩阵分成我单独转置的块,例如2x2块或40x40块,并查看哪个块大小最大高效的。 Edit2:矩阵按列主顺序存储,也就是说对于矩阵 a1 a2 a3 a4 存储为a1 a3 a2 a4 。 回答1 您可能会需要四个循环-两个循环遍历这些块,然后另外两个循环执行单个块的转置复制。 为简单起见,假设将矩阵大小划分为块大小,我想是这样的,尽管我想在信封背面画一些图片以确保: for (int i = 0; i < n; i += blocksize) { for (int j = 0; j < n; j += blocksize) { // transpose the block beginning at [i,j] for (int k = i; k < i + blocksize; ++k) { for (int
  • matlab矩阵定义、矩阵元素引用、矩阵操作
    矩阵定义 直接输入法 A=[1 2 3;4 5 6;7 8 9] 矩阵用方括号 “[ ]” 括起 矩阵同一行中的元素之间用 空格 或 逗号 分隔 矩阵行与行之间用 分号 分开 直接输入法中,分号可以用 回车 代替 A=[1 2 3 4 5 6 7 8 9;1 2 3] 由向量生成 通过编写m文件生成 利用MATLAB函数创建矩阵 基本矩阵函数如下: (1) ones()函数:产生全为1的矩阵,ones(n):产生nn维的全1矩阵,ones(m,n):产生mn维的全1矩阵; (2) zeros()函数:产生全为0的矩阵; (3) rand()函数:产生在(0,1)区间均匀分布的随机阵; (4) eye()函数:产生单位阵; (5) randn()函数:产生均值为0,方差为1的标准正态分布随机矩阵。 (6)tril()下三角矩阵 (7)triu()上三角矩阵 (8)diag(X):若 X 是矩阵,则 diag(X) 为 X 的主对角线向量 若 X 是向量,diag(X) 产生以 X 为主对角线的对角矩阵 diag(X,k)是提取第k条对角线的元素 使用格式 A=zeros(N) 产生NN的全零矩阵 A=zeros(M,N) 产生MN的全零矩阵 A=zeros(M,N,P,…)产生MNP*…的全零矩阵 A=zeros(siza(b)) 产生和矩阵B维数相同的全零矩阵 生成五阶的随机矩阵
  • 力扣刷题之867. 转置矩阵
    题目简述 给你一个二维整数数组 matrix, 返回 matrix 的 转置矩阵 。 矩阵的 转置 是指将矩阵的主对角线翻转,交换矩阵的行索引与列索引。 示例 1: 输入:matrix = [[1,2,3],[4,5,6],[7,8,9]] 输出:[[1,4,7],[2,5,8],[3,6,9]] 示例 2: 输入:matrix = [[1,2,3],[4,5,6]] 输出:[[1,4],[2,5],[3,6]] 提示 m == matrix.lengthn == matrix[i].length1 <= m, n <= 10001 <= m * n <= 105-10^9 <= matrix[i][j] <= 10^9 题目分析 看到题目的第一眼就想到直接把ij互换即可,但是如果简单的for循环会把已经换好的再换回去,最后和初始一样,所以其实只需要取对角线右上方的元素即可。代码如下: class Solution { public: vector<vector<int>> transpose(vector<vector<int>>& matrix) { int n=matrix.size(),m=matrix[0].size(),tmp,a=1; for(int i=0;i<m-1;i++){ for(int j=a;j<n;j++){ if(i!=j){ tmp=matrix
  • 转置一维NumPy数组(Transposing a 1D NumPy array)
    问题 我使用Python和NumPy,“移调”有一些问题: import numpy as np a = np.array([5,4]) print(a) print(a.T) 调用aT不会转置数组。 如果a例如是[[],[]]那么它可以正确地转置,但是我需要[...,...,...]的转置。 回答1 它的工作与预期的完全一样。 一维数组的转置仍然是一维数组! (如果您习惯使用matlab,从根本上就没有1D数组的概念。Matlab的“ 1D”数组是2D。) 如果要将一维矢量转换为二维数组然后转置,只需用np.newaxis对其进行np.newaxis (或None ,它们是相同的, newaxis更具可读性)。 import numpy as np a = np.array([5,4])[np.newaxis] print(a) print(a.T) 一般来说,尽管如此,您不必担心这一点。 如果只是出于习惯,添加额外的维度通常不是您想要的。 进行各种计算时,Numpy将自动广播一维数组。 当您只想使用向量时,通常无需区分行向量和列向量(都不是向量。它们都是二维的!)。 回答2 使用两对括号而不是一对。 这将创建一个可以转置的2D数组,这与使用一对括号时创建的1D数组不同。 import numpy as np a = np.array([[5, 4]]) a.T 更详尽的示例:
  • Image.fromarray 改变大小(Image.fromarray changes size)
    问题 我有要存储到图像中的数据。 我创建了一个宽度为 100 和高度为 28 的图像,我的矩阵具有相同的形状。 当我使用Image.fromarray(matrix) ,形状会发生变化: from PIL import Image img = Image.new('L', (100, 28)) tmp = Image.fromarray(matrix) print(matrix.shape) # (100, 28) print(tmp.size) # (28, 100) img.paste(tmp, (0, 0, 100, 28) # ValueError: images do not match 当我使用img.paste(tmp, (0, 0))对象被粘贴到图像中时,但缺少以 x 值 28 开头的部分。 为什么维度会发生变化? 回答1 PIL 和 numpy 有不同的索引系统。 matrix[a, b]为您提供 x 位置 b 和 y 位置 a 的点,但img.getpixel((a, b))为您提供 x 位置a和 y 位置b 的点。 因此,当您在 numpy 和 PIL 矩阵之间进行转换时,它们会切换维度。 要解决此问题,您可以采用矩阵的转置 ( matrix.transpose() )。 这是发生了什么: import numpy as np from PIL import
  • 用JavaScript转置2D数组(Transposing a 2D-array in JavaScript)
    问题 我有一个数组数组,像这样: [ [1,2,3], [1,2,3], [1,2,3], ] 我想对其进行转置以获得以下数组: [ [1,1,1], [2,2,2], [3,3,3], ] 使用循环以编程方式做到这一点并不难: function transposeArray(array, arrayLength){ var newArray = []; for(var i = 0; i < array.length; i++){ newArray.push([]); }; for(var i = 0; i < array.length; i++){ for(var j = 0; j < arrayLength; j++){ newArray[j].push(array[i][j]); }; }; return newArray; } 但是,这似乎很庞大,我觉得应该有一种更简单的方法来做到这一点。 在那儿? 回答1 array[0].map((_, colIndex) => array.map(row => row[colIndex])); map按顺序对数组中的每个元素调用提供的callback函数一次,然后根据结果构造一个新的数组。 仅对具有分配值的数组索引调用callback ; 对于已删除或从未分配值的索引,不会调用它。 callback使用三个参数调用:元素的值