1

Is it possible to create a grid like below? I didn't found anything in the forum.

#euler-project problem number 11
#In the 20 times 20 grid below,
#four numbers along a diagonal line have been marked in red.
#The product of these numbers is 26 times 63 times 78 times 14 = 1788696.
#What is the greatest product of four adjacent numbers in any direction
#(up, down, left, right, or diagonally) in the 20 times 20 grid?

import numpy

number = numpy.array([[08 02 22 97 38 15 00 40 00 75 04 05 07 78 52 12 50 77 91 08]
[49 49 99 40 17 81 18 57 60 87 17 40 98 43 69 48 04 56 62 00]
[81 49 31 73 55 79 14 29 93 71 40 67 53 88 30 03 49 13 36 65]
[52 70 95 23 04 60 11 42 69 24 68 56 01 32 56 71 37 02 36 91]
[22 31 16 71 51 67 63 89 41 92 36 54 22 40 40 28 66 33 13 80]
[24 47 32 60 99 03 45 02 44 75 33 53 78 36 84 20 35 17 12 50]
[32 98 81 28 64 23 67 10 26 38 40 67 59 54 70 66 18 38 64 70]
[67 26 20 68 02 62 12 20 95 63 94 39 63 08 40 91 66 49 94 21]
[24 55 58 05 66 73 99 26 97 17 78 78 96 83 14 88 34 89 63 72]
[21 36 23 09 75 00 76 44 20 45 35 14 00 61 33 97 34 31 33 95]
[78 17 53 28 22 75 31 67 15 94 03 80 04 62 16 14 09 53 56 92]
[16 39 05 42 96 35 31 47 55 58 88 24 00 17 54 24 36 29 85 57]
[86 56 00 48 35 71 89 07 05 44 44 37 44 60 21 58 51 54 17 58]
[19 80 81 68 05 94 47 69 28 73 92 13 86 52 17 77 04 89 55 40]
[04 52 08 83 97 35 99 16 07 97 57 32 16 26 26 79 33 27 98 66]
[88 36 68 87 57 62 20 72 03 46 33 67 46 55 12 32 63 93 53 69]
[04 42 16 73 38 25 39 11 24 94 72 18 08 46 29 32 40 62 76 36]
[20 69 36 41 72 30 23 88 34 62 99 69 82 67 59 85 74 04 36 16]
[20 73 35 29 78 31 90 01 74 31 49 71 48 86 81 16 23 57 05 54]
[01 70 54 71 83 51 54 69 16 92 33 48 61 43 52 01 89 19 67 48]])

EDIT no.1:

I found numpy-array now.

x = np.array([[1, 2, 3], [4, 5, 6]], np.int32)

Is there a way to do it without the commas?

EDIT no.2:

I also found a new problem. Python: Invalid Token Invalid token in number 08! :)

11
  • Perhaps you should look at arrays. Commented Jan 21, 2010 at 20:35
  • 1
    I think you need to explain a bit more. Are you trying to print it like this? How are the sequences in each list defined? Commented Jan 21, 2010 at 20:35
  • I cant use the first part of my code. But I need an array. I get this with using numpy.array. Now I am looking for an other method without commas. Thanks in advance. Commented Jan 21, 2010 at 20:47
  • Where do the numbers come from? I suspect they would come as a string, which can be easily converted to a one-dimensional array of ints, then re-shaped into a 2D array of the correct rows x cols. Commented Jan 21, 2010 at 21:07
  • 1
    Why can't you use commas though? If you use vim, replacing the spaces with commas is as simple as :s/ /, /g (or you can use the search and replace in your editor of choice... Commented Jan 22, 2010 at 1:38

5 Answers 5

3

You can define the numbers in a string and split it easily in row/columns:

nums = """\
1 2 3
4 5 6
7 8 9 10
"""
rows = [map(int, row.split()) for row in nums.splitlines()]
print rows      ##> [[1, 2, 3], [4, 5, 6], [7, 8, 9, 10]]
Sign up to request clarification or add additional context in comments.

Comments

2

Check out NumPy - specifically, the N-dimensional array object.

1 Comment

What do you mean? KingRadical
2

Your code example won't compile unless you put commas between the list elements.

For example, this will compile:

value = [
         [ 1, 2, 3, 4],
         [ 5, 6, 7, 8],
         [ 9,10,11,12]
        ]

If you're interested in taking strings like you show, and parsing them into a list of lists (or numpy multi-dimensional array), or if you have a list of lists or numpy array and want to print them out like you describe, you can do that too with a clever couple of list comprehensions.

3 Comments

Is there a way to do it without the commas?
Nope. NumPy needs a Python list type to convert to a NumPy array, which requires comma-delimited values.
Actually, there is a sort of round-about way of doing it without commas. Put the values in a space separated string, split at space, convert all list elements to ints/doubles and pass the resultant list to numpy.array. But why in the world anyone would want to do that, I have no idea...
0

What you have above does not work, e.g if pasted into a file and then run as a script, or pasted into the interpreter. I get:

SyntaxError: invalid token

Again, I suspect that what you have done is paste text (a string) containing these characters. They are not integers, and you will get nowhere unless you realize that fact.

Edit: I see...we only get "invalid syntax" if we avoid the "invalid token" error caused by the "08"

>>> import numpy
>>> number = numpy.array([[08 02 22 97]])
  File "<stdin>", line 1
    number = numpy.array([[08 02 22 97]])
                            ^
SyntaxError: invalid token
>>> number = numpy.array([[18 12 22 97]])
  File "<stdin>", line 1
    number = numpy.array([[18 12 22 97]])
                               ^
SyntaxError: invalid syntax

1 Comment

Actually, the 'invalid token' error is because python tries to parse 08 as an octal number, which is of course illegal...
0

As for parsing the actual data, and you don't want to read it from a file or use sensible methods, there is always this:

s = """[[08 02 22 97 38 15 00 40 00 75 04 05 07 78 52 12 50 77 91 08]
...etc
"""

s = s.replace("]", "").replace("[", "").split()

numbers = [int(x) for x in s]

Then you got a 1d array of numbers, which you can have fun with.

Comments

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.