use*_*599 7 python numpy python-3.x
所以我觉得我觉得这是一个非常愚蠢的问题.
我从文件创建一个数组:
A1=np.loadtxt(file, dtype='a100')
Run Code Online (Sandbox Code Playgroud)
我想在完成对另一个文件的处理之后编写该数组:
np.savetxt("Test.txt", A1, fmt=%s, delimiter=',')
Run Code Online (Sandbox Code Playgroud)
为什么写出来的?我想我明白它是把它写成字节,但对于我的生活,我无法弄清楚如何在没有b'的情况下写出来.
我知道这可能是我非常容易忽视的东西!
A1
作为字节串数组加载。Python3 使用 unicode 字符串作为默认值,因此通常在它们前面加上 'b'。这很正常print
。我有点惊讶它在文件写入期间也是如此。
无论如何,这似乎可以解决问题:
A2=np.array([x.decode() for x in A1])
np.savetxt("Test.txt", A2, fmt='%s', delimiter=',')
Run Code Online (Sandbox Code Playgroud)
A2
将有一个像dtype='<U100'
.
我的测试数组是:
array([b'one.com', b'two.url', b'three.four'], dtype='|S10')
Run Code Online (Sandbox Code Playgroud)
从一个简单的文本文件加载:
one.com
two.url
three.four
Run Code Online (Sandbox Code Playgroud)
.decode
是一个字符串方法。 [x.decode() for x in A1]
适用于一个简单的一维字节串数组。如果A1
是 2d,则必须对所有元素进行迭代,而不仅仅是行。如果A1
是结构化数组,则必须将其应用于元素内的字符串。
另一种可能性是在加载过程中使用转换器,因此您将获得一组(unicode)字符串
In [508]: A1=np.loadtxt('urls.txt', dtype='U',
converters={0:lambda x:x.decode()})
In [509]: A1
Out[509]:
array(['one.com', 'two.url', 'three.four'], dtype='<U10')
In [510]: np.savetxt('test0.txt',A1,fmt='%s')
In [511]: cat test0.txt
one.com
two.url
three.four
Run Code Online (Sandbox Code Playgroud)
包含的库loadtxt
有几个转换器函数asbytes
、asbytes_nested
、 和asstr
。所以converters
也可以是:converters={0:np.lib.npyio.asstr}
。
genfromtxt
处理这个没有converters
:
A1=np.genfromtxt('urls.txt', dtype='U')
# array(['one.com', 'two.url', 'three.four'], dtype='<U10')
Run Code Online (Sandbox Code Playgroud)
要理解为什么savetxt
按我们想要的方式保存 unicode 字符串,但附加b
for 字节字符串,我们必须查看它的代码。
np.savetxt
(在 py3 上运行)本质上是:
fh = open(fname, 'wb')
X = np.atleast_2d(X).T
# make a 'fmt' that matches the columns of X (with delimiters)
for row in X:
fh.write(asbytes(format % tuple(row) + newline))
Run Code Online (Sandbox Code Playgroud)
查看两个示例字符串(str 和 bytestr):
In [617]: asbytes('%s'%tuple(['one.two']))
Out[617]: b'one.two'
In [618]: asbytes('%s'%tuple([b'one.two']))
Out[618]: b"b'one.two'"
Run Code Online (Sandbox Code Playgroud)
写入“wb”文件会删除 的外层b''
,为字节串留下内层。它还解释了为什么将字符串('plain' py3 unicode)作为 'latin1' 字符串写入文件。
您可以直接编写一个字节串数组,而无需savetxt
. 例如:
A0 = array([b'one.com', b'two.url', b'three.four'], dtype='|S10')
with open('test0.txt','wb') as f:
for x in A0:
f.write(x+b'\n')
cat test0.txt
one.com
two.url
three.four
Run Code Online (Sandbox Code Playgroud)
Unicode 字符串也可以直接写入,生成相同的文件:
A1 = array(['one.com', 'two.url', 'three.four'], dtype='<U10')
with open('test1.txt','w') as f:
for x in A1:
f.write(x+'\n')
Run Code Online (Sandbox Code Playgroud)
此类文件的默认编码为encoding='UTF-8'
,与'one.com'.encode()
. 它的效果和什么savetxt
一样:
with open('test1.txt','wb') as f:
for x in A1:
f.write(x.encode()+b'\n')
Run Code Online (Sandbox Code Playgroud)
np.char
has.encode
和.decode
methods,它们似乎对数组的元素进行迭代操作。
因此
np.char.decode(A1) # convert |S10 to <U10, like [x.decode() for x in A1]
np.char.encode(A1) # convert <U10 to |S10
Run Code Online (Sandbox Code Playgroud)
这适用于多维数组
np.savetxt('testm.txt',np.char.decode(A_bytes[:,None][:,[0,0]]),
fmt='%s',delimiter=', ')
Run Code Online (Sandbox Code Playgroud)
对于结构化数组,np.char.decode
必须单独应用于每个字符字段。
归档时间: |
|
查看次数: |
3500 次 |
最近记录: |