2017-08-24 48 views
3

例如,如果一個提問/回答您遇到的帖子數組是這樣的:相當於熊貓read_clipboard的NumPy?

[[ 0 1 2 3 4 5 6 7] 
[ 8 9 10 11 12 13 14 15] 
[16 17 18 19 20 21 22 23] 
[24 25 26 27 28 29 30 31] 
[32 33 34 35 36 37 38 39] 
[40 41 42 43 44 45 46 47] 
[48 49 50 51 52 53 54 55] 
[56 57 58 59 60 61 62 63]] 

你會如何將其加載到一個REPL會話變量,而不必到處加逗號?

+0

我不認爲有直接的等值。 –

+0

@ juanpa.arrivillaga那麼,應該有。超便利的方法ftw。 –

+4

Ehhh我更認爲人們應該負責提供可重複的例子。打印(repr(arr))'有多難?但這仍是一個很好的問題。 –

回答

3

如果你有大熊貓,pyperclip或something else to read from the clipboard你可以使用這樣的事情:

from pandas.io.clipboard import clipboard_get 
# import pyperclip 
import numpy as np 
import re 
import ast 

def numpy_from_clipboard(): 
    inp = clipboard_get() 
    # inp = pyperclip.paste() 
    inp = inp.strip() 
    # if it starts with "array(" we just need to remove the 
    # leading "array(" and remove the optional ", dtype=xxx)" 
    if inp.startswith('array('): 
     inp = re.sub(r'^array\(', '', inp) 
     dtype = re.search(r', dtype=(\w+)\)$', inp) 
     if dtype: 
      return np.array(ast.literal_eval(inp[:dtype.start()]), dtype=dtype.group(1)) 
     else: 
      return np.array(ast.literal_eval(inp[:-1])) 
    else: 
     # In case it's the string representation it's a bit harder. 
     # We need to remove all spaces between closing and opening brackets 
     inp = re.sub(r'\]\s+\[', '],[', inp) 
     # We need to remove all whitespaces following an opening bracket 
     inp = re.sub(r'\[\s+', '[', inp) 
     # and all leading whitespaces before closing brackets 
     inp = re.sub(r'\s+\]', ']', inp) 
     # replace all remaining whitespaces with "," 
     inp = re.sub(r'\s+', ',', inp) 
     return np.array(ast.literal_eval(inp)) 

然後閱讀你保存在剪貼板:

>>> numpy_from_clipboard() 
array([[ 0, 1, 2, 3, 4, 5, 6, 7], 
     [ 8, 9, 10, 11, 12, 13, 14, 15], 
     [16, 17, 18, 19, 20, 21, 22, 23], 
     [24, 25, 26, 27, 28, 29, 30, 31], 
     [32, 33, 34, 35, 36, 37, 38, 39], 
     [40, 41, 42, 43, 44, 45, 46, 47], 
     [48, 49, 50, 51, 52, 53, 54, 55], 
     [56, 57, 58, 59, 60, 61, 62, 63]]) 

這應該能夠從剪貼板解析(最)陣列(str以及陣列repr)。它甚至應該多線陣工作(其中np.loadtxt失敗):

[[ 0.34866207 0.38494993 0.7053722 0.64586156 0.27607369 0.34850162 
    0.20530567 0.46583039 0.52982216 0.92062115] 
[ 0.06973858 0.13249867 0.52419149 0.94707951 0.868956 0.72904737 
    0.51666421 0.95239542 0.98487436 0.40597835] 
[ 0.66246734 0.85333546 0.072423 0.76936201 0.40067016 0.83163118 
    0.45404714 0.0151064 0.14140024 0.12029861] 
[ 0.2189936 0.36662076 0.90078913 0.39249484 0.82844509 0.63609079 
    0.18102383 0.05339892 0.3243505 0.64685352] 
[ 0.803504 0.57531309 0.0372428 0.8308381 0.89134864 0.39525473 
    0.84138386 0.32848746 0.76247531 0.99299639]] 

>>> numpy_from_clipboard() 
array([[ 0.34866207, 0.38494993, 0.7053722 , 0.64586156, 0.27607369, 
     0.34850162, 0.20530567, 0.46583039, 0.52982216, 0.92062115], 
     [ 0.06973858, 0.13249867, 0.52419149, 0.94707951, 0.868956 , 
     0.72904737, 0.51666421, 0.95239542, 0.98487436, 0.40597835], 
     [ 0.66246734, 0.85333546, 0.072423 , 0.76936201, 0.40067016, 
     0.83163118, 0.45404714, 0.0151064 , 0.14140024, 0.12029861], 
     [ 0.2189936 , 0.36662076, 0.90078913, 0.39249484, 0.82844509, 
     0.63609079, 0.18102383, 0.05339892, 0.3243505 , 0.64685352], 
     [ 0.803504 , 0.57531309, 0.0372428 , 0.8308381 , 0.89134864, 
     0.39525473, 0.84138386, 0.32848746, 0.76247531, 0.99299639]]) 

不過我不和正則表達式太好,所以這可能不是萬無一失的,並使用ast.literal_eval感覺有點awkard(但它避免了做你自己解析)。

隨意提出改進建議。

5

對於一次性的場合,我可能做到這一點:

  • 複製包含數組到剪貼板中的文本。
  • 在ipython shell中,輸入s = """,但不要返回。
  • 粘貼剪貼板中的文本。
  • 輸入結束三重報價。

這給了我:

In [16]: s = """[[ 0 1 2 3 4 5 6 7] 
    ...: [ 8 9 10 11 12 13 14 15] 
    ...: [16 17 18 19 20 21 22 23] 
    ...: [24 25 26 27 28 29 30 31] 
    ...: [32 33 34 35 36 37 38 39] 
    ...: [40 41 42 43 44 45 46 47] 
    ...: [48 49 50 51 52 53 54 55] 
    ...: [56 57 58 59 60 61 62 63]]""" 

然後用np.loadtxt()如下:

In [17]: a = np.loadtxt([line.lstrip(' [').rstrip(']') for line in s.splitlines()], dtype=int) 

In [18]: a 
Out[18]: 
array([[ 0, 1, 2, 3, 4, 5, 6, 7], 
     [ 8, 9, 10, 11, 12, 13, 14, 15], 
     [16, 17, 18, 19, 20, 21, 22, 23], 
     [24, 25, 26, 27, 28, 29, 30, 31], 
     [32, 33, 34, 35, 36, 37, 38, 39], 
     [40, 41, 42, 43, 44, 45, 46, 47], 
     [48, 49, 50, 51, 52, 53, 54, 55], 
     [56, 57, 58, 59, 60, 61, 62, 63]])