문제

이것 ~해야 한다 쉬워요.

다음은 내 배열입니다 (오히려 대표적인 테스트 어레이를 생성하는 방법) :

>>> ri = numpy.random.randint
>>> ri2 = lambda x: ''.join(ri(0,9,x).astype('S'))
>>> a = array([float(ri2(x)+ '.' + ri2(y)) for x,y in ri(1,10,(10,2))])
>>> a
array([  7.99914000e+01,   2.08000000e+01,   3.94000000e+02,
         4.66100000e+03,   5.00000000e+00,   1.72575100e+03,
         3.91500000e+02,   1.90610000e+04,   1.16247000e+04,
         3.53920000e+02])

나는 ' n'.join (list_o_strings)이 인쇄하는 문자열 목록을 원한다.

   79.9914
   20.8
  394.0
 4661.0
    5.0
 1725.751
  391.5
19061.0
11624.7
  353.92

우주 패드를 왼쪽으로하고 싶습니다 그리고 권리 (그러나 필요 이상).

소수점 이후의 전부라면 소수점 후에 0을 원합니다.

나는 과학적 표기법을 원하지 않습니다.

.. 그리고 나는 상당한 숫자를 잃고 싶지 않습니다. (353.98000000000002에서 2는 중요하지 않습니다)

예, 원해서 좋네요 ..

파이썬 2.5 %g, %fx.x, 등은 나를 괴롭 히거나 할 수 없습니다. 나는 시도하지 않았다 import decimal 아직. 나는 그것을 볼 수 없다 Numpy (하지만, array.__str__ 그리고 array.__repr__ 소수점이 정렬되어 있지만 때로는 과학적으로 돌아갑니다).

아, 그리고 속도 계산. 나는 여기에서 큰 배열을 다루고 있습니다.

내 현재 솔루션 접근법은 다음과 같습니다.

  1. str (a)에게 Numpy의 괄호를 구문 분석합니다.
  2. str (e) 배열의 각 요소와 분할 ( '.')에 패드 및 재구성
  3. A.astype ( 's'+str (i))에 내가 내가 MAX (len (str (a)), 그런 다음 패드입니다.

기성어 솔루션이 있어야하는 것 같습니다 ... (그러나 필요하지 않습니다)

최고 제안이 언제 실패합니다 dtype IS float64 :

>>> a
array([  5.50056103e+02,   6.77383566e+03,   6.01001513e+05,
         3.55425142e+08,   7.07254875e+05,   8.83174744e+02,
         8.22320510e+01,   4.25076609e+08,   6.28662635e+07,
         1.56503068e+02])
>>> ut0 = re.compile(r'(\d)0+$')
>>> thelist = [ut0.sub(r'\1', "%12f" % x) for x in a]
>>> print '\n'.join(thelist)
  550.056103
 6773.835663
601001.513
355425141.8471
707254.875038
  883.174744
   82.232051
425076608.7676
62866263.55
  156.503068
도움이 되었습니까?

해결책

죄송하지만 철저한 조사 후에는 최소한의 사후 처리없이 필요한 작업을 수행 할 수있는 방법을 찾을 수 없습니다 (보고 싶지 않은 후행 0을 제거하려면). 같은 것 :

import re
ut0 = re.compile(r'(\d)0+$')

thelist = [ut0.sub(r'\1', "%12f" % x) for x in a]

print '\n'.join(thelist)

빠르고 간결하지만 "상용"이라는 제약을 깨뜨립니다. 대신, 일반적인 형식 (거의 원하는 것을 수행하지만 숨기고 싶어하는 0을 남기고)의 모듈 식 조합입니다. 바람직하지 않은 후행 0을 제거합니다. 실제로, 나는 그것이 당신이 필요로하는 것을 정확하게 수행한다고 생각하지만, 언급 된대로 당신의 조건은 과도하게 제한된다고 생각합니다.

편집하다: 원래 질문이 더 중요한 숫자를 지정하기 위해 편집되었으며, 가장 많은 숫자에 필요한 것 이상의 추가 선행 공간이 필요하지 않으며, 새로운 예제 (위의 이전 제안이 원하는 출력과 일치하지 않는 경우)를 제공합니다. 많은 문자열에 공통적 인 선행 공백을 제거하는 작업이 가장 잘 수행됩니다. TextWrap.Dedent - 그러나 필요한 출력은 문자열 목록입니다. 문제 없습니다. 우리는 단지 줄을 정리하고, 그들을 헌신하고, 다시 나뉘겠습니다.

import re
import textwrap

a = [  5.50056103e+02,   6.77383566e+03,   6.01001513e+05,
         3.55425142e+08,   7.07254875e+05,   8.83174744e+02,
         8.22320510e+01,   4.25076609e+08,   6.28662635e+07,
         1.56503068e+02]

thelist = textwrap.dedent(
        '\n'.join(ut0.sub(r'\1', "%20f" % x) for x in a)).splitlines()

print '\n'.join(thelist)

방출 :

      550.056103
     6773.83566
   601001.513
355425142.0
   707254.875
      883.174744
       82.232051
425076609.0
 62866263.5
      156.503068

다른 팁

Pythons 문자열 서식은 필요한 소수성 ( %g) 만 인쇄하거나 고정 된 소수점 세트 ( %f)를 사용할 수 있습니다. 그러나 숫자가 정수 인 경우를 제외하고는 필요한 소수점 만 인쇄하려고합니다. 그러면 하나의 소수점을 원하기 때문에 복잡합니다.

이것은 당신이 다음과 같은 것들로 끝날 것을 의미합니다.

def printarr(arr):
    for x in array:
        if math.floor(x) == x:
            res = '%.1f' % x
        else:
            res = '%.10g' % x
        print "%*s" % (15-res.find('.')+len(res), res)

값이 정수 인 경우 먼저 1 진수의 문자열이 생성되거나, 단위 숫자가 아닌 경우 자동 소수점 (그러나 최대 10 숫자)으로 인쇄됩니다. 마지막으로 소수점이 정렬되도록 조정되고 조정됩니다.

아마도 Numpy는 실제로 당신이 원하는 것을 수행 할 것입니다. 왜냐하면 당신은 일반적으로 너무 길면 지수 모드에 있기를 원하기 때문입니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top