# Add commas after matrix-elements in matrix()

I want to replace the brackets, but to add commas after each matrix-element, except the last ones in the rows.

I get only the first part.

Is there an elementary way to add commas to the sage-matrix?
Because matrix() has the great advantage that the elements are aligned in all cases.

m = matrix([[2222,333,44444], [1,0,0]])
mymatrix =  m.str().replace('[', '').replace(']', '') # replace [, ]
print mymatrix


Out Actual:

 2222   333 44444
1     0     0


Out Target:

 2222,   333, 44444
1,     0,     0

edit retag close merge delete

Sort by » oldest newest most voted I think you should continue to manipulate m.str(), but using regular expressions, since m.str() already has the correct spacing. The following will work if you know that the matrix entries will be numbers (plus a possible decimal point and/or minus sign), no letters:

import re
m = matrix([[2222,333,44444], [1,0,0]])
no_brackets =  m.str().replace('[', '').replace(']', '') # replace [, ]
add_commas = re.sub("([-.0-9]+) ", "\\1, ", no_brackets)


Output:

 2222,   333, 44444
1,     0,     0

more

@JohnPalmieri And this runs for you? I get NameError: name 're' is not defined

1

Sorry, I forgot to add import re. I will edit the answer.

Alternatively, this should work for more general matrix entries: m.str(rep_mapping=lambda a: str(a) + ",").replace('[', '').replace(',]', '')

Hello, @geroyx! A little bit of string processing can help you to cope with this. Let us define the following function:

def mat2str(m):
mat = [] # a list of the rows
for i in range(m.nrows()):
row = [] # list of the elements of a row
for j in range(m.ncols()):
row.append(str(m[i,j])) # convert element j in row i to str and append it to "row"
mat.append(', '.join(row)) # use ", " between two elements in "row" and append to "mat"
return '\n'.join(mat) # add a new line character between each row in "mat" and return


Then, you can write

m = matrix([[0,0,1], [1,0,0]])
print mat2str(m)


in order to obtain

0, 0, 1
1, 0, 0


Alternatively, here is another approach to defining str2mat:

def mat2str(m):
mat = '\n'.join([', '.join([str(m[i,j]) for j in range(m.ncols())]) for i in range(m.nrows())])
return mat


This is more direct, but far less difficult to read.

I hope this helps!

more

@dsejas Thank you for your answer, and that's a good explanation too! However, I wonder if there is a way to "hack" the Sage matrix with commas. Because matrix() has the great advantage that the elements are "aligned" in all cases (this is not the case with the string method as far as I know); my numerical example was not well chosen; I will edit a better one.

Hello, @geroyx! I'm sorry I didn't understand the purpose of your question. There are two things you can do:

• You can define a new function like in this code. By overwriting sage.typeset.symbols.ascii_left_square_bracket and sage.typeset.symbols.ascii_right_square_bracket, you force Sage to not show the brackets. The comma separation is tricky; the only way to cope with that without re-coding Sage is to use a function like this.
• Next comment.
• If you really want Sage to automatically do what the function in point 1 does, you have to re-code or hack a part of Sage tself. I can help with that, actually. I have modified the file <SAGE>/src/sage/matrix/matrix0.pyx, which is a Cython file, in order to handle the representation of matrices in Sage. The function str is the responsible for that. So, I rewrote it to avoid using delimiters around matrices, and add a comma between elements. You can find the modified code here. Find the mentioned file (<SAGE>/src/sage/matrix/matrix0.pyx, where <SAGE> indicates the folder where you installed or decompressed Sage), go to line 1758, delete the str function, and replace it with my code. Finally, execute sage -b so the new code is compiled.

Please, let me know which of these approaches is what you want, so I can update my answer. Feel free to ask if you have any question.

list(m)  ?